Bug #79908 [ReO->Csd]: json_encode encodes negative zero as int

From: Date: Tue, 13 Jul 2021 13:34:58 +0000
Subject: Bug #79908 [ReO->Csd]: json_encode encodes negative zero as int
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-235001@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=79908&edit=1

 ID:                 79908
 Updated by:         git@php.net
 Reported by:        stefan at HDmeteo dot com
 Summary:            json_encode encodes negative zero as int
-Status:             Re-Opened
+Status:             Closed
 Type:               Bug
 Package:            JSON related
 PHP Version:        7.4.8
 Assigned To:        cmb
 Block user comment: N
 Private report:     N

 New Comment:

Automatic comment on behalf of cmb69
Revision: https://github.com/php/php-src/commit/717f1ed5e4b4b2083907dd085e66b377edad24b7
Log: Fix #79908: json_encode encodes negative zero as int


Previous Comments:
------------------------------------------------------------------------
[2021-07-13 11:15:47] cmb@php.net

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

------------------------------------------------------------------------
[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)

------------------------------------------------------------------------


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


Thread (13 messages)

« previous php.bugs (#235001) next »