Edit report at https://bugs.php.net/bug.php?id=79908&edit=1
ID: 79908
Patch added by: cmb@php.net
Reported by: stefan at HDmeteo dot com
Summary: json_decode decodes negative zero as positive zero
Status: Re-Opened
Type: Bug
Package: JSON related
PHP Version: 7.4.8
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
The following pull request has been associated:
Patch Name: Fix #79908: json_decode decodes negative zero as positive zero
On GitHub: https://github.com/php/php-src/pull/7234
Patch: https://github.com/php/php-src/pull/7234.patch
Previous Comments:
------------------------------------------------------------------------
[2021-02-18 11:46:19] stasiukaitis dot saulius at gmail dot com
3rd party library stoped working after upgrade to PHP 7.4
This is because it compares data before and after encoding which becomes different.
https://github.com/psecio/jwt/blob/master/src/Psecio/Jwt/Jwt.php#L157
------------------------------------------------------------------------
[2020-07-30 09:32:52] stefan at HDmeteo dot com
JavaScript does the decoding as suggested in my solution 2 (decode -0 as float -0.0 or as string
"-0"):
https://jsfiddle.net/:
input:
JSON.parse("-0")
output:
-0
------------------------------------------------------------------------
[2020-07-29 11:45:28] cmb@php.net
Well, I think it makes sense to check what other JSON
implementations do in this case.
------------------------------------------------------------------------
[2020-07-29 10:57:07] stefan at HDmeteo dot com
while JSON_PRESERVE_ZERO_FRACTION solves the problem superficially, the behaviour of
json_encode/json_decode is not logically clean.
There are 2 clean solutions:
1. Fix json_encode:
do not output "-0" as there is no negative integer 0.
encode (float) (-0.0) as "0" without JSON_PRESERVE_ZERO_FRACTION
encode (float) (-0.0) as "-0.0" with JSON_PRESERVE_ZERO_FRACTION
2. Fix json_decode:
interprete "-0" as negative float 0.0 as there is no negative integer
0.
decode "0" as (int) 0
decode "-0" as (float) (-0.0)
------------------------------------------------------------------------
[2020-07-28 16:15:24] cmb@php.net
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
If you want to preserve the floating point number (there are no
integers with value -0), you have to pass JSON_PRESERVE_ZERO_FRACTION;
see <https://3v4l.org/1ZRm8>.
------------------------------------------------------------------------
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=79908
--
Edit this bug report at https://bugs.php.net/bug.php?id=79908&edit=1