Json improvements

This commit is contained in:
Taras Machyshyn
2014-04-22 12:00:53 +03:00
parent 55ca7c1c4f
commit 0359d71f5c
2 changed files with 144 additions and 78 deletions
+118 -62
View File
@@ -18,95 +18,101 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
namespace Espo\Core\Utils;
class Json
{
/**
* JSON encode a string
*
* @param string $value
* @param int $options Default 0
* @param int $depth Default 512
* @return string
*/
* JSON encode a string
*
* @param string $value
* @param int $options Default 0
* @param int $depth Default 512
* @return string
*/
public static function encode($value, $options = 0, $depth = 512)
{
if (version_compare(phpversion(), '5.5.0', '>=')) {
$json = json_encode($value, $options, $depth);
}
elseif (version_compare(phpversion(), '5.3.0', '>=')) {
$json = json_encode($value, $options, $depth);
}
elseif (version_compare(phpversion(), '5.3.0', '>=')) {
/*Check if options are supported for this version of PHP*/
if (is_int($options)) {
$json = json_encode($value, $options);
}
if (is_int($options)) {
$json = json_encode($value, $options);
}
else {
$json = json_encode($value);
}
}
else {
$json = json_encode($value);
}
if ($json===null) {
$GLOBALS['log']->error('Value cannot be decoded to JSON - '.print_r($value, true));
}
else {
$json = json_encode($value);
}
return $json;
$error = self::getLastError();
if ($json === null || $error) {
$GLOBALS['log']->error('Json::encode():' . $error . ' - ' . print_r($value, true));
}
return $json;
}
/**
* JSON decode a string (Fixed problem with "\")
*
* @param string $json
* @param bool $assoc Default false
* @param int $depth Default 512
* @param int $options Default 0
* @return object
*/
* JSON decode a string (Fixed problem with "\")
*
* @param string $json
* @param bool $assoc Default false
* @param int $depth Default 512
* @param int $options Default 0
* @return object
*/
public static function decode($json, $assoc = false, $depth = 512, $options = 0)
{
if (is_array($json)) {
$GLOBALS['log']->warning('JSON:decode() - JSON cannot be decoded - '.$json);
$GLOBALS['log']->warning('Json::decode() - JSON cannot be decoded - '.$json);
return false;
}
if(version_compare(phpversion(), '5.4.0', '>=')) {
$json = json_decode($json, $assoc, $depth, $options);
}
elseif(version_compare(phpversion(), '5.3.0', '>=')) {
$json = json_decode($json, $assoc, $depth);
}
else {
$json = json_decode($json, $assoc);
}
if(version_compare(phpversion(), '5.4.0', '>=')) {
$json = json_decode($json, $assoc, $depth, $options);
}
elseif(version_compare(phpversion(), '5.3.0', '>=')) {
$json = json_decode($json, $assoc, $depth);
}
else {
$json = json_decode($json, $assoc);
}
return $json;
}
$error = self::getLastError();
if ($json === null || $error) {
$GLOBALS['log']->error('Json::decode():' . $error);
}
/**
* Check if the string is JSON
*
* @param string $json
* @return bool
*/
public static function isJSON($json)
{
if ($json === '[]' || $json === '{}') {
return true;
} else if (is_array($json)) {
return false;
}
return static::decode($json) != null;
return $json;
}
/**
* Get an array data (if JSON convert to array)
* Check if the string is JSON
*
* @param string $json
* @return bool
*/
public static function isJSON($json)
{
if ($json === '[]' || $json === '{}') {
return true;
} else if (is_array($json)) {
return false;
}
return static::decode($json) != null;
}
/**
* Get an array data (if JSON convert to array)
*
* @param mixed $data - can be JSON, array
*
@@ -115,14 +121,64 @@ class Json
public static function getArrayData($data)
{
if (is_array($data)) {
return $data;
return $data;
}
else if (static::isJSON($data)) {
return static::decode($data, true);
}
return static::decode($data, true);
}
return array();
}
protected static function getLastError($error = null)
{
if (!isset($error)) {
$error = json_last_error();
}
switch ($error) {
case JSON_ERROR_NONE:
return false;
break;
case JSON_ERROR_DEPTH:
return 'The maximum stack depth has been exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
return 'Invalid or malformed JSON';
break;
case JSON_ERROR_CTRL_CHAR:
return 'Control character error, possibly incorrectly encoded';
break;
case JSON_ERROR_SYNTAX:
return 'Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
return 'Malformed UTF-8 characters, possibly incorrectly encoded';
break;
/* Only for PHP 5.5.0
case JSON_ERROR_RECURSION:
return 'One or more recursive references in the value to be encoded';
break;
case JSON_ERROR_INF_OR_NAN:
return 'One or more NAN or INF values in the value to be encoded';
break;
case JSON_ERROR_UNSUPPORTED_TYPE:
return 'A value of a type that cannot be encoded was given';
break;
*/
default:
return 'Unknown error';
break;
}
}
}
+26 -16
View File
@@ -6,38 +6,48 @@ use Espo\Core\Utils\Json;
class JsonTest extends \PHPUnit_Framework_TestCase
{
function testEncode()
protected function setUp()
{
$GLOBALS['log'] = $this->getMockBuilder('\Espo\Core\Utils\Log')->disableOriginalConstructor()->getMock();
}
protected function tearDown()
{
$this->object = NULL;
}
public function testEncode()
{
$testVal= array('testOption'=>'Test');
$this->assertEquals(json_encode($testVal), Json::encode($testVal));
}
function testDecode()
public function testDecode()
{
$testVal= array('testOption'=>'Test');
$this->assertEquals($testVal, Json::decode(json_encode($testVal), true));
$this->assertEquals($testVal, Json::decode(json_encode($testVal), true));
$test= '{"folder":"data\/logs"}';
$this->assertEquals('data/logs', Json::decode($test)->folder);
$this->assertEquals('data/logs', Json::decode($test)->folder);
}
function testIsJSON()
public function testIsJSON()
{
$this->assertTrue(Json::isJSON('{"database":{"driver":"pdo_mysql","host":"localhost"},"devMode":true}'));
$this->assertTrue(Json::isJSON('[]'));
$this->assertTrue(Json::isJSON('{}'));
$this->assertTrue(Json::isJSON('true'));
$this->assertTrue(Json::isJSON('{"database":{"driver":"pdo_mysql","host":"localhost"},"devMode":true}'));
$this->assertTrue(Json::isJSON('[]'));
$this->assertTrue(Json::isJSON('{}'));
$this->assertTrue(Json::isJSON('true'));
$this->assertFalse(Json::isJSON('some string'));
$this->assertTrue(Json::isJSON(true));
$this->assertEquals('true', json_encode(true));
$this->assertFalse(Json::isJSON(false));
$this->assertEquals('false', json_encode(false));
$this->assertEquals('false', json_encode(false));
}