添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Authentication Services
Command Line Specific Extensions
Compression and Archive Extensions
Cryptography Extensions
Database Extensions
Date and Time Related Extensions
File System Related Extensions
Human Language and Character Encoding Support
Image Processing and Generation
Mail Related Extensions
Mathematical Extensions
Non-Text MIME Output
Process Control Extensions
Other Basic Extensions
Other Services
Search Engine Extensions
Server Specific Extensions
Session Extensions
Text Processing
Variable and Type Related Extensions
Web Services
Windows Only Extensions
XML Manipulation
GUI Extensions
Keyboard Shortcuts
?
This help
Next menu item
Previous menu item
Previous man page
Next man page
Scroll to bottom
Scroll to top
Goto homepage
Goto search
(current page)
Focus search box
传递给 json_encode() 函数的对象或数组包含了递归引用,导致无法被编码。如果打开了 JSON_PARTIAL_OUTPUT_ON_ERROR 选项,则牵涉到递归引用的数据会转换成 null 后返回。 传递了不支持的数据类型给 json_encode() 函数,比如 resource 。如果打开了 JSON_PARTIAL_OUTPUT_ON_ERROR 选项,则对于不支持的数据类型,会转换成 null 后返回。 A key starting with \u0000 character was in the string passed to json_decode() when decoding a JSON object into a PHP object. The line terminators are kept unescaped when JSON_UNESCAPED_UNICODE is supplied. It uses the same behaviour as it was before PHP 7.1 without this constant. Available since PHP 7.1.0. 如果发生错误则会抛出 JsonException ,而不是通过 json_last_error() json_last_error_msg() 检索设置到全局的错误状态。 JSON_PARTIAL_OUTPUT_ON_ERROR 优先于 JSON_THROW_ON_ERROR 。自 PHP 7.3.0 起生效。 majid4466 at gmail dot com
8 years ago
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]
?>
Yzmir Ramirez
10 years ago
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
nikospapoutsis
2 years ago
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 .
ASchmidt at Anamera dot net
6 years ago
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.
eduard dot amoros dot wahl at gmail dot com
1 month ago
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.
Anonymous
6 years ago
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