A super easy PHP Framework for web development! https://github.com/exacti/phacil-framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.0 KiB

<?php
/**
* Copyright © 2022 ExacTI Technology Solutions. All rights reserved.
* GPLv3 General License.
* https://exacti.com.br
* Phacil PHP Framework - https://github.com/exacti/phacil-framework
* @author Bruno O. Notario <bruno@exacti.com.br>
*/
namespace Phacil\Framework;
use Phacil\Framework\Interfaces\Serializer;
/**
* Serialize data to JSON, unserialize JSON encoded data
*
* @api
* @since 2.0.0
*/
class Json implements Serializer
{
/**
* Encode data into string
*
* @param string|int|float|bool|array|null $data
* @return string|bool
* @throws \Phacil\Framework\Exception\InvalidArgumentException
* @since 2.0.0
*/
static public function encode($data)
{
$result = \json_encode($data);
if (false === $result) {
throw new \Phacil\Framework\Exception\InvalidArgumentException("Unable to serialize value. Error: " . self::json_last_error_msg());
}
return $result;
}
/**
* Decode the given string
*
* @param string $string
* @return string|int|float|bool|array|null
* @throws \Phacil\Framework\Exception\InvalidArgumentException
* @since 2.0.0
*/
static public function decode($string, $array = true)
{
$result = \json_decode($string, $array);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \Phacil\Framework\Exception\InvalidArgumentException("Unable to unserialize value. Error: " . self::json_last_error_msg());
}
return $result;
}
/**
* @inheritDoc
* @since 2.0.0
*/
public function serialize( $data){
return self::encode($data);
}
/**
* @inheritDoc
* @since 2.0.0
*/
public function unserialize($data){
return self::decode($data);
}
static private function fallbackErrorMsg()
{
//$JSON_ERROR_RECURSION = (defined('JSON_ERROR_RECURSION') ? JSON_ERROR_RECURSION : 6);
$ERRORS = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded',
Config::JSON_ERROR_RECURSION(6) => 'One or more recursive references in the value to be encoded',
Config::JSON_ERROR_INF_OR_NAN(7) => 'One or more NAN or INF values in the value to be encoded',
Config::JSON_ERROR_UNSUPPORTED_TYPE(8) => 'A value of a type that cannot be encoded was given',
Config::JSON_ERROR_INVALID_PROPERTY_NAME(9) => 'A property name that cannot be encoded was given',
Config::JSON_ERROR_UTF16(10) => 'Malformed UTF-16 characters, possibly incorrectly encoded'
);
$error = json_last_error();
return function_exists('json_last_error_msg') ? json_last_error_msg() : (isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error');
}
/**
* json_last_error_msg compatibility function
*
* @return string
* @since 2.0.0
*/
static public function json_last_error_msg()
{
return function_exists('json_last_error_msg') ? json_last_error_msg() : self::fallbackErrorMsg();
}
}