ID: 38680 User updated by: RQuadling at GMail dot com Reported By: RQuadling at GMail dot com -Status: Bogus +Status: Open Bug Type: Documentation problem Operating System: Windows XP SP2 PHP Version: Irrelevant New Comment:
Why is this bogus? I've reopened it as the PHP Dox makes no mention of the restriction that only objects and arrays are encodable/decodable. And if the json_encode only dealt with arrays & objects rather than all types except resources, then the code would be cleaner and give less issue. Previous Comments: ------------------------------------------------------------------------ [2006-09-01 14:43:33] RQuadling at GMail dot com I'm not sure I follow. I'm reading the PHP doc and json_encode says it can encode _ANY_ type except resource. json_decode says it "takes a JSON encoded string and converts it into a PHP variable". So, $m_var = json_decode(json_decode($m_original_var)); $m_var == $m_original_var. Maybe NOT ===, but at least == So, there are several issues here. json_encode says ANY type. Not just objects or arrays. Admittedly, an array with int/bool/null in all work fine as does a multi-dimensional array. If the dox said JUST arrays and objects, then that would be fine too. You could then emit a warning when the types supplied wasn't an array or an object. But, as it stands, the dox say __ANY__, so, it is VERY reasonable to assume that encoding boolean/integers/null via json_encode will produce something usable. AND json_decode says it will decode any json_encoded string. Now, at this stage, I'm not even using the data, I'm just encoding it and then instantly decoding it. Not via a browser or JS. Just all in PHP. And this is not working. In your reply you say that "true/false/null/numerics in raw form are not valid JSON structures, so json_decode will reject them and output NULL" - Fair enough, but not what my bug report is about. I'm saying that json_encode is NOT producing correctly encoded structures for json_decode, NOT that I'm manually creating these structures and expecting them to work. <?php var_dump(json_decode(json_encode(True))); var_dump(json_decode(json_encode(False))); var_dump(json_decode(json_encode(Null))); var_dump(json_decode(json_encode(pi()))); var_dump(json_decode(json_encode(phpversion()))); ?> produces NULL NULL NULL NULL NULL Very much NOT what would be expected! ------------------------------------------------------------------------ [2006-09-01 14:25:21] [EMAIL PROTECTED] Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php This is a documentation issue... true/false/null/numerics in raw form are not valid JSON structures, so json_decode will reject them and output NULL. Basically, if JSON_checker (http://www.json.org/JSON_checker/) says something is invalid JSON, then json_decode will return NULL. json_encode emits true/false/etc as any other way makes even less sense. :) ------------------------------------------------------------------------ [2006-09-01 13:30:31] [EMAIL PROTECTED] Omar: really a doc issue? ------------------------------------------------------------------------ [2006-09-01 11:42:30] RQuadling at GMail dot com Description: ------------ Hi. I might be widly wrong but I would have thought that json_decode would quite happily reverse a json_encode. This seems to work fine for arrays and null (not tested with objects), but doesn't work at all with strings, integers or booleans. Though I think the NULL working is just a fluke. I can allow for the integer to not match as there is no type info as far as I can tell. The documentation DOES say that ... "Returns a string containing the JSON representation of value. Parameters value The value being encoded. Can be __any__ type except a resource. Return Values Returns a JSON encoded string on success." Note __any__ type. Amendment after trying to submit bug : I see that bug#38440 relates to this. And as this has been fixed in CVS, then I suspect this is now a documentation issue. Reproduce code: --------------- <?php $a_Originals = array ( 'SimpleString' => 'This is a string', 'Array' => array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5), 'Integer' => 1234, 'Boolean_True' => True, 'Boolean_False' => False, 'NULL' => NULL, ); foreach($a_Originals as $s_Type => $m_Data) { $s_JS_Encoded = json_encode($m_Data); $m_JS_Decoded_Array = json_decode($s_JS_Encoded, True); echo "\n========================================\nEncoding $s_Type : "; var_dump($m_Data); echo "Encoded : "; var_dump($s_JS_Encoded); echo "Decoded : "; var_dump($m_JS_Decoded_Array); echo (serialize($m_Data) === serialize($m_JS_Decoded_Array)) ? "\nMatches\n" : "\n**** DOES NOT MATCH ****\n"; } ?> Expected result: ---------------- ======================================== Encoding SimpleString : string(16) "This is a string" Encoded : string(18) ""This is a string"" Decoded : string(16) "This is a string" Matches ======================================== Encoding Array : array(5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) } Encoded : string(31) "{"a":1,"b":2,"c":3,"d":4,"e":5}" Decoded : array(5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) } Matches ======================================== Encoding Integer : int(1234) Encoded : string(4) "1234" Decoded : string(1234) **** DOES NOT MATCH **** ======================================== Encoding Boolean_True : bool(true) Encoded : string(4) "true" Decoded : bool(true) Matches ======================================== Encoding Boolean_False : bool(false) Encoded : string(5) "false" Decoded : bool(false) Matches ======================================== Encoding NULL : NULL Encoded : string(4) "null" Decoded : NULL Matches Actual result: -------------- ======================================== Encoding SimpleString : string(16) "This is a string" Encoded : string(18) ""This is a string"" Decoded : NULL **** DOES NOT MATCH **** ======================================== Encoding Array : array(5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) } Encoded : string(31) "{"a":1,"b":2,"c":3,"d":4,"e":5}" Decoded : array(5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) } Matches ======================================== Encoding Integer : int(1234) Encoded : string(4) "1234" Decoded : NULL **** DOES NOT MATCH **** ======================================== Encoding Boolean_True : bool(true) Encoded : string(4) "true" Decoded : NULL **** DOES NOT MATCH **** ======================================== Encoding Boolean_False : bool(false) Encoded : string(5) "false" Decoded : NULL **** DOES NOT MATCH **** ======================================== Encoding NULL : NULL Encoded : string(4) "null" Decoded : NULL Matches ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=38680&edit=1