ID: 46600 Updated by: scott...@php.net Reported By: Matt at mpcm dot com -Status: Verified +Status: Feedback Bug Type: JSON related Operating System: * PHP Version: 5CVS, 6CVS (2008-11-18)
Previous Comments: ------------------------------------------------------------------------ [2008-12-18 03:27:25] scott...@php.net I'm not even sure what the bug is? You can't have an empty property name hence the use of "_empty_". The key collision thing is a very edge case, are you saying you ran into this in a real life usage? The best course of action may be to have this documented on the json_encode() and json_decode() pages. ------------------------------------------------------------------------ [2008-12-04 20:39:13] Matt at mpcm dot com Thanx for the reply magicaltux, `Feature` is an interesting word considering the possible key collision. There are other ways to get things that are not strictly objects to behave that way. Overloading (like example #1 at http://us.php.net/manual/en/language.oop5.overloading.php). It works well enough as long as you also make it iterate correctly. What I am suggesting is that it is better to fail in decoding into an object, than to silently cause a key collision. Or alternatively, produce an overloaded object which can have these keys (by default, or passed optional flag) from json_decode. It's an opinion, but a wrapper gets me where I need to be for now, and I'm pretty sure this is an edge case. $a = '{"":"a","_empty_":"b"}'; echo json_encode(json_decode($a)); echo json_encode(json_decode($a, true)); output: {"_empty_":"b"} {"":"a","_empty_":"b"} for some values: $a != json_encode(json_decode($a)); ------------------------------------------------------------------------ [2008-12-04 10:44:29] magical...@php.net I believe this is not a bug, but a feature. An object *can't* have an empty property (while an array can). If you want to use json_decode() with json containing empty key, either access those empty key using special keyword "_empty_", or put the optionnal $assoc parameter of json_decode() to true to get result as an array. If you want objects to support empty keys, I believe this is not going to happen soon, as this is enforced by a specific error message. Fatal error: Cannot access empty property in php shell code on line 1 Please note that a property name starting with NULL character won't work either. ------------------------------------------------------------------------ [2008-11-18 17:35:30] matt at mpcm dot com The language seems to create a key that cannot be reached, so even if this `bug` is fixed, we am still facing a broader issue it seems. <? $key = ""; $o = (object) array($key=>4,"example"=>8); var_dump($o); print 'blank key test:' . (isset($o->$key)?'true':'false'); print $o->{$key}; var_dump($o->$key); ?> output: object(stdClass)#1 (2) { [""]=> int(4) ["example"]=> int(8) } blank key test:false<br /> <b>Fatal error</b>: Cannot access empty property in <b>PHPDocument1</b> on line <b>8</b><br /> All throws Notice: line 4 - Illegal member variable name ------------------------------------------------------------------------ [2008-11-18 15:43:05] matt at mpcm dot com All the work arounds I am looking at are throwing Error Text: Illegal member variable name when I convert/cast an object with a blank property. Is this json_decode `bug` a result of a larger object mechanism limitation inside of php's object handling? ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/46600 -- Edit this bug report at http://bugs.php.net/?id=46600&edit=1