Edit report at https://bugs.php.net/bug.php?id=81685&edit=1
ID: 81685
Updated by: bukka@php.net
Reported by: joaquimsb89 at gmail dot com
Summary: Using json_decode with an integer as first parameter
doesn't return NULL
-Status: Open
+Status: Closed
Type: Documentation Problem
Package: JSON related
Operating System: Debian & Arch
PHP Version: 7.4.26
-Assigned To:
+Assigned To: bukka
Block user comment: N
Private report: N
New Comment:
As noted above, this is just a type juggling. If you want to be sure that passing number fails,
declare strict types.
Without that declared, the example
var_dump(json_decode(123, true));
is basically just
var_dump(json_decode('123', true));
Previous Comments:
------------------------------------------------------------------------
[2021-12-30 11:04:17] a at b dot c dot de
'Also, the PHP website points that the implemented logic is for RFC 7159 - which is being
adjusted by the RFC 8259, so it's unfair point to "another RFC" than the one
mentioned on the website.'
The differences between the two are documented in Appendix A of RFC 8259; none of them affect the
grammar, and the only one that has any impact on implementation is that JSON must be UTF-8 encoded
to be valid. I don't know if this has any impact on PHP's parsing, but I doubt it, as the
only legitimate non-ASCII characters would be inside JSON string values.
For further examples of JSON values, see either RFC (they have the same examples). The ECMA
published standard describes the grammar in terms of railroad diagrams basically copied from
JSON.org. Note that all of them allow a plain number or string as a "JSON value" (as well
as objects, arrays, null, true, and false).
'A JSON text is a sequence of tokens. The set of tokens includes six
structural characters, strings, numbers, and three literal names.'
Yes, and '123' is a number. The next paragraph after the one you quoted says:
' A JSON text is a serialized value. Note that certain previous
specifications of JSON constrained a JSON text to be an object or an
array. Implementations that generate only objects or arrays where a
JSON text is called for will be interoperable in the sense that all
implementations will accept these as conforming JSON texts.'
------------------------------------------------------------------------
[2021-12-30 10:42:36] a at b dot c dot de
Oh:
"The JSON Data Interchange Syntax"
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
------------------------------------------------------------------------
[2021-12-30 10:40:07] a at b dot c dot de
Isn't this just bog-standard type juggling? Passed an integer argument to a string parameter,
it recast the integer as a string?
declare(strict_types=1);
$v = json_decode(123, true);
var_dump($v);
var_dump(json_last_error_msg());
------------------------------------------------------------------------
[2021-12-01 16:16:21] me at davidgarcia dot cat
I am not aiming to start an argument, so I won't post more messages. But I believe some
clarification might help. Thanks for your understanding,
----
Won't this behaviour cause, then, a potential error when processing external requests (like API
calls) as we won't be able to retrieve a "valid JSON object" that can be converted to
an object via json_decode($payload, false) or to an array via json_code($payload, true)?
Even the official PHP website does not have an example for any input payload that is not a
JSON-parsed string format, including {} and / or [] and bearing in mind the
"key":"value" format.
https://www.php.net/json_decode
If the RFC 8259 is implemented as expected, then it looks like there's a lack of documentation
on the PHP website (that leads to confusion) to cover these cases.
Also, the PHP website points that the implemented logic is for RFC 7159 - which is being adjusted by
the RFC 8259, so it's unfair point to "another RFC" than the one mentioned on the
website.
Extra reading would be appreciated here. Would be possible getting directions on where other
examples can be found, please, so it's possible to contrast this specific case?
------------------------------------------------------------------------
[2021-12-01 15:46:44] cmb@php.net
RFC 8259 is a standards document; neither that Wikipedia page nor
that json.org page are. And besides, adhering Postel's law is
almost never a bad idea.
------------------------------------------------------------------------
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
https://bugs.php.net/bug.php?id=81685
--
Edit this bug report at https://bugs.php.net/bug.php?id=81685&edit=1