ID:               38680
 Updated by:       [EMAIL PROTECTED]
 Reported By:      RQuadling at GMail dot com
-Status:           Bogus
+Status:           Open
 Bug Type:         Documentation problem
 Operating System: Windows XP SP2
 PHP Version:      Irrelevant
 Assigned To:      omar


Previous Comments:
------------------------------------------------------------------------

[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

Reply via email to