From de97cd181221df78b7b976d660ade912e64cb130 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 11 Oct 2013 18:33:21 +0200 Subject: [PATCH] Fix: json --- htdocs/core/lib/json.lib.php | 10 ++++++---- test/phpunit/JsonLibTest.php | 31 ++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/htdocs/core/lib/json.lib.php b/htdocs/core/lib/json.lib.php index ada9673fb80..69dbb4eba1a 100644 --- a/htdocs/core/lib/json.lib.php +++ b/htdocs/core/lib/json.lib.php @@ -54,14 +54,16 @@ function dol_json_encode($elements) //var_dump($num); // determine type - if (is_numeric(key($elements))) + if (is_numeric(key($elements)) && key($elements) == 0) { // indexed (list) + $keysofelements=array_keys($elements); // Elements array mus have key that does not start with 0 and end with num-1, so we will use this later. $output = '['; - for ($i = 0, $last = ($num - 1); isset($elements[$i]); ++$i) + for ($i = 0, $last = ($num - 1); $i < $num; $i++) { - if (is_array($elements[$i]) || is_object($elements[$i])) $output.= json_encode($elements[$i]); - else $output .= _val($elements[$i]); + if (! isset($elements[$keysofelements[$i]])) continue; + if (is_array($elements[$keysofelements[$i]]) || is_object($elements[$keysofelements[$i]])) $output.= json_encode($elements[$keysofelements[$i]]); + else $output .= _val($elements[$keysofelements[$i]]); if ($i !== $last) $output.= ','; } $output.= ']'; diff --git a/test/phpunit/JsonLibTest.php b/test/phpunit/JsonLibTest.php index 1ad4a29b1e8..8110df2a6cf 100755 --- a/test/phpunit/JsonLibTest.php +++ b/test/phpunit/JsonLibTest.php @@ -130,22 +130,35 @@ class JsonLibTest extends PHPUnit_Framework_TestCase $this->savlangs=$langs; $this->savdb=$db; + // Do a test with an array starting with 0 $arraytotest=array(0=>array('key'=>1,'value'=>'PRODREF','label'=>'Product ref with é and special chars \\ \' "')); - + $arrayencodedexpected='[{"key":1,"value":"PRODREF","label":"Product ref with \u00e9 and special chars \\\\ \' \""}]'; + $encoded=json_encode($arraytotest); - //var_dump($encoded); - $this->assertEquals('[{"key":1,"value":"PRODREF","label":"Product ref with \u00e9 and special chars \\\\ \' \""}]',$encoded); + $this->assertEquals($arrayencodedexpected,$encoded); $decoded=json_decode($encoded,true); - //var_dump($decoded); - $this->assertEquals($arraytotest,$decoded); + $this->assertEquals($arraytotest,$decoded,'test for json_xxx'); $encoded=dol_json_encode($arraytotest); - //var_dump($encoded); - $this->assertEquals('[{"key":1,"value":"PRODREF","label":"Product ref with \u00e9 and special chars \\\\ \' \""}]',$encoded); + $this->assertEquals($arrayencodedexpected,$encoded); $decoded=dol_json_decode($encoded,true); - //var_dump($decoded); - $this->assertEquals($arraytotest,$decoded); + $this->assertEquals($arraytotest,$decoded,'test for dol_json_xxx'); + // Same test but array start with 2 instead of 0 + $arraytotest=array(2=>array('key'=>1,'value'=>'PRODREF','label'=>'Product ref with é and special chars \\ \' "')); + $arrayencodedexpected='{"2":{"key":1,"value":"PRODREF","label":"Product ref with \u00e9 and special chars \\\\ \' \""}}'; + + $encoded=json_encode($arraytotest); + $this->assertEquals($arrayencodedexpected,$encoded); + $decoded=json_decode($encoded,true); + $this->assertEquals($arraytotest,$decoded,'test for json_xxx'); + + $encoded=dol_json_encode($arraytotest); + $this->assertEquals($arrayencodedexpected,$encoded); + $decoded=dol_json_decode($encoded,true); + $this->assertEquals($arraytotest,$decoded,'test for dol_json_xxx'); + + // Test with object $now=gmmktime(12,0,0,1,1,1970); $objecttotest=new stdClass(); $objecttotest->property1='abc';