Predefined Constants
The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime.
The following constants indicate the type of error returned by json_last_error().
-
JSON_ERROR_NONE
(integer) - No error has occurred. Available since PHP 5.3.0.
-
JSON_ERROR_DEPTH
(integer) - The maximum stack depth has been exceeded. Available since PHP 5.3.0.
-
JSON_ERROR_STATE_MISMATCH
(integer) - Occurs with underflow or with the modes mismatch. Available since PHP 5.3.0.
-
JSON_ERROR_CTRL_CHAR
(integer) - Control character error, possibly incorrectly encoded. Available since PHP 5.3.0.
-
JSON_ERROR_SYNTAX
(integer) - Syntax error. Available since PHP 5.3.0.
-
JSON_ERROR_UTF8
(integer) - Malformed UTF-8 characters, possibly incorrectly encoded. This constant is available as of PHP 5.3.3.
-
JSON_ERROR_RECURSION
(integer) -
The object or array passed to json_encode() include recursive references and cannot be encoded. If the
JSON_PARTIAL_OUTPUT_ON_ERROR
option was given,NULL
will be encoded in the place of the recursive reference.This constant is available as of PHP 5.5.0.
-
JSON_ERROR_INF_OR_NAN
(integer) -
The value passed to json_encode() includes either
NAN
orINF
. If theJSON_PARTIAL_OUTPUT_ON_ERROR
option was given, 0 will be encoded in the place of these special numbers.This constant is available as of PHP 5.5.0.
-
JSON_ERROR_UNSUPPORTED_TYPE
(integer) -
A value of an unsupported type was given to json_encode(), such as a resource. If the
JSON_PARTIAL_OUTPUT_ON_ERROR
option was given,NULL
will be encoded in the place of the unsupported value.This constant is available as of PHP 5.5.0.
The following constants can be combined to form options for json_encode().
-
JSON_HEX_TAG
(integer) - All < and > are converted to \u003C and \u003E. Available since PHP 5.3.0.
-
JSON_HEX_AMP
(integer) - All &s are converted to \u0026. Available since PHP 5.3.0.
-
JSON_HEX_APOS
(integer) - All ' are converted to \u0027. Available since PHP 5.3.0.
-
JSON_HEX_QUOT
(integer) - All " are converted to \u0022. Available since PHP 5.3.0.
-
JSON_FORCE_OBJECT
(integer) - Outputs an object rather than an array when a non-associative array is used. Especially useful when the recipient of the output is expecting an object and the array is empty. Available since PHP 5.3.0.
-
JSON_NUMERIC_CHECK
(integer) - Encodes numeric strings as numbers. Available since PHP 5.3.3.
-
JSON_BIGINT_AS_STRING
(integer) - Encodes large integers as their original string value. Available since PHP 5.4.0.
-
JSON_PRETTY_PRINT
(integer) - Use whitespace in returned data to format it. Available since PHP 5.4.0.
-
JSON_UNESCAPED_SLASHES
(integer) - Don't escape /. Available since PHP 5.4.0.
-
JSON_UNESCAPED_UNICODE
(integer) - Encode multibyte Unicode characters literally (default is to escape as \uXXXX). Available since PHP 5.4.0.
Коментарии
If you curious of the numeric values of the constants, as of JSON 1.2.1, the constants have the following values (not that you should use the numbers directly):
JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256
JSON_ERROR_DEPTH => 1
JSON_ERROR_STATE_MISMATCH => 2
JSON_ERROR_CTRL_CHAR => 3
JSON_ERROR_SYNTAX => 4
JSON_ERROR_UTF8 => 5
JSON_OBJECT_AS_ARRAY => 1
JSON_BIGINT_AS_STRING => 2
To get a really clean json string use these three constants like so:
<?php
$array = ['€', 'http://example.com/some/cool/page', '337'];
$bad = json_encode($array);
$good = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
// $bad would be ["\u20ac","http:\/\/example.com\/some\/cool\/page","337"]
// $good would be ["€","http://example.com/some/cool/page",337]
?>
In a multi-level array, JSON_FORCE_OBJECT will encode ALL nested numeric arrays as objects.
If your concern was ONLY the first-level array (e.g., to make it suitable as a MySQL JSON column), you could just cast your first-level array to object, e.g.:
<?php
$json = json_encode( (object) $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>
Or, if you have large arrays and are concerned about the overhead of object casting, you could append a "null" value beyond the size of the array, which will force the array to become associative:
<?php
$beyond = count( $array ) + 1;
if ( !array_key_exists( $beyond, $array) )
$array[ $beyond ] = NULL;
$json = json_encode( $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>
Of course, your later code has to treat an element with a "NULL" value the same as "!isset()", if it iterates the array.
flags JSON_NUMERIC_CHECK and JSON_PRESERVE_ZERO_FRACTION are broken in php 7+ — json_encode((float)8.8) returns "8.8000000000000007", and json_encode((float)8.8, JSON_NUMERIC_CHECK) and json_encode((float)8.8, JSON_PRESERVE_ZERO_FRACTION) return "8.8000000000000007" too.
the only way to fix this is setting "serialize_precision = -1" in php.ini
Be EXTREMELY cautious when using the code majid4466 at gmail dot com provided, or JSON_NUMERIC_CHECK in general.
For example, in php 7.4 and 8.1 with precision: 14 and serialize_precision: -1 we get:
<?php
$array = ['€', 55.6666666666666666, 'http://example.com/some/cool/page', '000337', '55.6666666666666666'];
echo $case1 = json_encode($array);
echo $case2 = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
echo $case3 = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
["\u20ac",55.666666666666664,"http:\/\/example.com\/some\/cool\/page","000337","55.6666666666666666"]
// in $case1, both euro sign and the url change but we also lost a digit in our unquoted float (due to precision)
["€",55.666666666666664,"http://example.com/some/cool/page","000337","55.6666666666666666"]
// in $case2, both euro sign and the url stay exactly the same but we still lost a digit in our unquoted float (due to precision)
["€",55.666666666666664,"http://example.com/some/cool/page",337,55.666666666666664]
// in $case3, we once again keep euro sign and the url intact but this time not only our unquoted float lost a digit
// but the same happened to our quoted float and the number/string lost its leading zeros too
Also, note that in php 5.x you will probably get some different but equally wrong results as default values may be different and some functions have changed internally as well.
Warning about JSON_NUMERIC_CHECK and scientific notation.
JSON_NUMERIC_CHECK will remove scientific notation. Thus,
json_encode(['scientificNumber' => '1e-4'], JSON_NUMERIC_CHECK);
will return {"scientificNumber":0.0001}
You have to account for this, as it may defeat the whole purpose of scientific notation.