php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #60111 JSON_NUMERIC_CHECK option mangles certain values
Submitted: 2011-10-21 22:56 UTC Modified: 2011-10-22 20:47 UTC
Votes:1
Avg. Score:3.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:0 (0.0%)
From: digit6 at gmail dot com Assigned:
Status: Closed Package: JSON related
PHP Version: 5.3.8 OS: FreeBSD
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: digit6 at gmail dot com
New email:
PHP Version: OS:

 

 [2011-10-21 22:56 UTC] digit6 at gmail dot com
Description:
------------
json_encode will produce undesired results when used with JSON_NUMERIC_CHECK when one or more values is longer than 12 digits, ex: 3434343434343434. The resulting JSON encoded string has the above value listed as: 3434343434340000.

Removing the JSON_NUMERIC_CHECK option fixes the problem, but then all other numeric values are returned as strings rather than integers.



Test script:
---------------
$test = array("test"=>3434343434343434);

$test = json_encode($test, JSON_NUMERIC_CHECK);

echo $test;




Expected result:
----------------
{"test":3434343434343434}
OR
{"test":"3434343434343434"}

Actual result:
--------------
{"test":3434343434340000}

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2011-10-22 00:17 UTC] digit6 at gmail dot com
Incorrect ACTUAL output entered in bug, here is the real actual output:

{"test":3.43434343434e+15}
 [2011-10-22 00:44 UTC] digit6 at gmail dot com
I would further like to add that even if I FORCE the numeric string to be of a string type in the array before passing it to json_encode(), the encode still treats the string encapsulated number as a LONG and not as a string.

There is definitely a bug here.
 [2011-10-22 10:45 UTC] laruence@php.net
-Status: Open +Status: Feedback
 [2011-10-22 10:45 UTC] laruence@php.net
I think your are running in 32-bit os,
 
and I think it is not a bug, since the number value exceed the PHP_INT_MAX.
 [2011-10-22 20:47 UTC] digit6 at gmail dot com
-Status: Feedback +Status: Closed
 [2011-10-22 20:47 UTC] digit6 at gmail dot com
^^ You are actually right on this. I was not taking into account that JSON_NUMERIC_CHECK's actual purpose is to look for strings of numeric values and automatically convert them to int values. In my example of forcing a string type on the numeric string, would still require NUMERIC_CHECK to reformat the var type.

I was simply using JSON_NUMERIC_CHECK to ensure all my number values were integers, the fact that my platform may use a long set of numbers with no alpha chars in a "tracking number" field would break my implementation was not considered.

I'm closing the bug, I'll have to just make sure I'm forcing int values where I require it manually.

Thanks!
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Dec 13 02:01:27 2024 UTC