以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。
次の定数は、json_last_error() が返したり、 JsonException の code に格納されている エラーの型を表します。
JSON_ERROR_NONE
(int )
JSON_ERROR_DEPTH
(int )
JSON_ERROR_STATE_MISMATCH
(int )
JSON_ERROR_CTRL_CHAR
(int )
JSON_ERROR_SYNTAX
(int )
JSON_ERROR_UTF8
(int )
JSON_ERROR_RECURSION
(int )
json_encode() に渡した配列やオブジェクトに再帰参照が含まれており、エンコードできません。
JSON_PARTIAL_OUTPUT_ON_ERROR
オプションを指定した場合は、
再帰参照の部分を null
にエンコードします。
JSON_ERROR_INF_OR_NAN
(int )
NAN
あるいは INF
が含まれています。
JSON_PARTIAL_OUTPUT_ON_ERROR
オプションを指定した場合は、
これらの特殊な数値を 0
にエンコードします。
JSON_ERROR_UNSUPPORTED_TYPE
(int )
JSON_PARTIAL_OUTPUT_ON_ERROR
オプションを指定した場合は、
これらを null
にエンコードします。
JSON_ERROR_INVALID_PROPERTY_NAME
(int )
JSON_ERROR_UTF16
(int )
JSON_ERROR_NON_BACKED_ENUM
(int )
次の定数は、 json_decode() のオプションとして 組み合わせて使用します。
JSON_BIGINT_AS_STRING
(int )
JSON_OBJECT_AS_ARRAY
(int )
true
に設定して呼び出すことで、自動的に設定できます。
次の定数は、 json_encode() のオプションとして組み合わせて使用します。
JSON_HEX_TAG
(int )
JSON_HEX_AMP
(int )
JSON_HEX_APOS
(int )
JSON_HEX_QUOT
(int )
JSON_FORCE_OBJECT
(int )
JSON_NUMERIC_CHECK
(int )
JSON_PRETTY_PRINT
(int )
JSON_UNESCAPED_SLASHES
(int )
/
をエスケープしません。
JSON_UNESCAPED_UNICODE
(int )
JSON_PARTIAL_OUTPUT_ON_ERROR
(int )
JSON_PRESERVE_ZERO_FRACTION
(int )
JSON_UNESCAPED_LINE_TERMINATORS
(int )
JSON_UNESCAPED_UNICODE
が指定されると、
行の終端をエスケープされないままにします。
PHP 7.1 より前のバージョンでは、
この定数がなくてもそういう振る舞いをしていました。
PHP 7.1.0 以降で使用可能です。
次の定数は、 json_decode() および json_encode() のオプションとして組み合わせて使用します。
JSON_INVALID_UTF8_IGNORE
(int )
JSON_INVALID_UTF8_SUBSTITUTE
(int )
JSON_THROW_ON_ERROR
(int )
JSON_PARTIAL_OUTPUT_ON_ERROR
は
JSON_THROW_ON_ERROR
よりも優先します。
PHP 7.3.0 以降で使用可能です。
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]
?>
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
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.
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.
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.
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