Edit report at https://bugs.php.net/bug.php?id=62422&edit=1
ID: 62422 Comment by: ajf at ajf dot me Reported by: arnfda at gmail dot com Summary: Function that always produces legal JSON Status: Open Type: Feature/Change Request Package: JSON related Operating System: OS X 10.6.8 PHP Version: 5.4.4 Block user comment: N Private report: N New Comment: Shouldn't PHP error or warn here? Returning a JSON string with an array containing the element, instead of just the element passed, is probably not what the user expects. Previous Comments: ------------------------------------------------------------------------ [2012-06-27 02:41:03] arnfda at gmail dot com It is a weird thing to do, but it's necessary in the case of serving JSON to a client that won't decode isolated primitives. It could be argued that that's the client's problem, but since the spec is ambiguous I'd say it should be given the benefit of the doubt. The default behavior of json_encode definitely shouldn't be changed, but perhaps another option similar to JSON_FORCE_OBJECT could be added, JSON_FORCE_ARRAY maybe? ------------------------------------------------------------------------ [2012-06-27 02:07:50] ahar...@php.net My initial gut feeling is to Won't Fix this: automatically casting a scalar input to an array or object is decidedly weird. I guess we could generate a notice to note that scalar inputs result in non-RFC output. At any rate, Crockford himself is ambiguous on the validity of isolated JSON primitives. The RFC grammar doesn't permit them, but the text suggests that they may be permitted, the json.org grammar chart doesn't express an opinion, the reference encoder allows them and encodes and decodes the same way as PHP, and he told Joey in an e-mail (after we debated this on IRC a couple of years back and Joey e-mailed him) that the RFC was only written to associate the MIME type with the format and that "it is not the spec". (Joey can presumably furnish the entire details of the exchange; I'm quoting him quoting Crockford.) In summary, even a simple spec like JSON is a bit of a choose your own adventure. I wouldn't be completely against a notice, but I don't think we should change the behaviour, both for BC and interoperability reasons. ------------------------------------------------------------------------ [2012-06-26 14:58:55] arnfda at gmail dot com Description: ------------ json_encode generates illegal JSON when it is passed a string, boolean, or number. This behavior is noted here, along with a workaround: http://www.php.net/manual/en/function.json-encode.php#92817 json_decode accepts the illegal JSON, but other parsers that are more strict do not (for example, MultiJson in Ruby). I know the documentation doesn't promise to return valid JSON text, just the "JSON representation" of whatever is passed into it. So strictly speaking, this isn't a bug. But it doesn't make sense to have a function that creates JSON fragments and not one that always produces legal JSON that you can safely pass to other systems. It would be great if an option was added to json_encode that forced it to produce legal JSON strings, e.g. by wrapping single values in brackets as in the examples below. Test script: --------------- var_dump(json_encode(1)); var_dump(json_encode(true)); var_dump(json_encode("string")); Expected result: ---------------- string(3) "[1]" string(6) "[true]" string(10) "["string"]" Actual result: -------------- string(1) "1" string(4) "true" string(8) ""string"" ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=62422&edit=1