Edit report at https://bugs.php.net/bug.php?id=79958&edit=1
ID: 79958
User updated by: jmuraca at gmail dot com
Reported by: jmuraca at gmail dot com
Summary: json_encode does not support JSON_BIGINT_AS_STRING
Status: Not a bug
Type: Bug
Package: JSON related
Operating System: windows (all?)
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
This ID large number format is how Texas represents utility account number. I can't change
that.
I agree with the previous comment that I'd like to use it as a string as no math is performed.
I'd like to use json_encode as my primary function to output json. And within that same output
I'd like small integers to be represented as numbers, hence the use of JSON_NUMERIC_CHECK.
What I do not want is json_encode to change the large number from a string or int to scientific
notation. By representing the number as a string, and then json_encode outputting in scientific
notation, I am losing valuable information along the way.
My suggestion for JSON_BIGINT_AS_STRING solves this as it preserves my need for a string on a large
number, which I happen to use as an ID, and allows smaller numbers to be represented as int and not
string.
Previous Comments:
------------------------------------------------------------------------
[2020-08-13 00:13:49] a at b dot c dot de
If you load a big integer (one that exceeds PHP_INT_MAX) from a database and you try to use it in
PHP as a number, then the conversion to double happens when you store it in PHP.
In your example
$data = array("val_num" => 1008901020901566350119, "val_string" =>
"1008901020901566350119", "int" => "1", "string" =>
"12345");
$data['val_num'] is already a floating-point number (try var_dump($data) to see); the
conversion has nothing to do with JSON, and the encoder is only given a floating-point PHP number
(and not a "bigint").
(Since the number is an identifier and not something that actually involves any arithmetic I could
argue that it's not an integer in the first place, just a string written with a particularly
limited alphabet. But that's a database design issue for somewhere else.)
------------------------------------------------------------------------
[2020-08-12 16:22:44] jmuraca at gmail dot com
If I load a long number from a database, which in this case happens to be a valid ID number,
I'd like to preserve that formatting and not convert to scientific notation when encoding to
JSON.
I understand the MAX INT value for a system so I can get around this by treating it as a string, but
when I call json_encode with the JSON_NUMERIC_CHECK flag set, it converts to scientific notation.
$data = array("val_num" => 1008901020901566350119, "val_string" =>
"1008901020901566350119", "int" => "1", "string" =>
"12345");
var_dump(json_encode($data, JSON_NUMERIC_CHECK));
// returns:
{"val_num":1.0089010209015663e+21,"val_string":1.0089010209015663e+21,"int":1,"string":12345}
I'd like to be able to handle small int as numbers, and big int as string or numbers.
JSON_BIGINT_AS_STRING feel like the correct parameter to output this - literally any big integers
are encoded to a string.
------------------------------------------------------------------------
[2020-08-12 07:21:55] cmb@php.net
json_encode() doesn't support the JSON_BIGINT_AS_STRING option;
this is for json_decode() only. You'll want to drop the
JSON_NUMERIC_CHECK option as well: <https://3v4l.org/bGaka>.
------------------------------------------------------------------------
[2020-08-12 06:53:04] sjon@php.net
it seems you are missing some context in your report - the numbers you use for your examples exceed
the 64 bit maximum in PHP (see PHP_INT_MAX).
Given that PHP cannot process or print integers that big, it switches to scientific notation which
is better then nothing.
You might have an interesting feature-request when encoding for a 32 bit system
------------------------------------------------------------------------
[2020-08-12 00:31:09] jmuraca at gmail dot com
Description:
------------
json_encode should be able to accept the parameter JSON_BIGINT_AS_STRING to display large numbers as
string and/or numeric rather than scientific notation
my use case is a long number like that is used for some account management identifiers (my included
example is fake) and I want to json output the whole number - not a scientific number
Test script:
---------------
// correct, displays scientific notation
$data = array("val" => 1008901020901566350119);
var_dump(json_encode($data));
// correct, displays val as string
$data = array("val" => "1008901020901566350119");
var_dump(json_encode($data));
// correct, displays val as numeric
$data = array("val" => "1008901020901566350119");
var_dump(json_encode($data, JSON_NUMERIC_CHECK));
// ERROR, displays val as scientific
// ideally with JSON_BIGINT_AS_STRING val display as numeric and full number
$data = array("val" => "1008901020901566350119");
var_dump(json_encode($data, JSON_NUMERIC_CHECK|JSON_BIGINT_AS_STRING));
// ERROR, displays val as scientific
// ideally with JSON_BIGINT_AS_STRING val display as numeric and full number
$data = array("val" => 1008901020901566350119);
var_dump(json_encode($data, JSON_BIGINT_AS_STRING));
Expected result:
----------------
$data = array("val" => "1008901020901566350119");
var_dump(json_encode($data, JSON_NUMERIC_CHECK|JSON_BIGINT_AS_STRING));
// actual: 1.0089010209015663e+21
// expected: 1008901020901566350119
$data = array("val" => 1008901020901566350119);
var_dump(json_encode($data, JSON_BIGINT_AS_STRING));
// actual: 1.0089010209015663e+21
// expected: 1008901020901566350119
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=79958&edit=1