预定义常量

以下常量由此扩展定义,只有在扩展编译到 PHP 中或在运行时动态加载时才可用。

以下常量指示由 json_last_error() 返回的错误类型或存储为 JsonExceptioncode

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)
UTF-8 字符格式错误,可能是编码错误。
JSON_ERROR_RECURSION (int)
传递给 json_encode() 的对象或数组包含递归引用,无法编码。如果指定了 JSON_PARTIAL_OUTPUT_ON_ERROR 选项,则 null 将编码在递归引用的位置。
JSON_ERROR_INF_OR_NAN (int)
传递给 json_encode() 的值包含 NANINF。如果指定了 JSON_PARTIAL_OUTPUT_ON_ERROR 选项,则 0 将编码在这些特殊数字的位置。
JSON_ERROR_UNSUPPORTED_TYPE (int)
传递给 json_encode() 的值类型不受支持,例如 资源。如果指定了 JSON_PARTIAL_OUTPUT_ON_ERROR 选项,则 null 将编码在不受支持的值的位置。
JSON_ERROR_INVALID_PROPERTY_NAME (int)
在将 JSON 对象解码为 PHP 对象时,传递给 json_decode() 的字符串中存在以 \u0000 字符开头的键。
JSON_ERROR_UTF16 (int)
传递给 json_decode() 的 JSON 字符串中包含的 unicode 转义中存在单个未配对的 UTF-16 代理。

以下常量可以组合起来为 json_decode() 形成选项。

JSON_BIGINT_AS_STRING (int)
将大整数解码为其原始字符串值。
JSON_OBJECT_AS_ARRAY (int)
将 JSON 对象解码为 PHP 数组。此选项可以通过使用第二个参数等于 true 来调用 json_decode() 来自动添加。

以下常量可以组合起来为 json_encode() 形成选项。

JSON_HEX_TAG (int)
所有 < 和 > 都被转换为 \u003C 和 \u003E。
JSON_HEX_AMP (int)
所有 & 都被转换为 \u0026。
JSON_HEX_APOS (int)
所有 ' 都被转换为 \u0027。
JSON_HEX_QUOT (int)
所有 " 都被转换为 \u0022。
JSON_FORCE_OBJECT (int)
当使用非关联数组时,输出对象而不是数组。当输出的接收者期望一个对象并且数组为空时,这尤其有用。
JSON_NUMERIC_CHECK (int)
将数字字符串编码为数字。
JSON_PRETTY_PRINT (int)
在返回的数据中使用空格来格式化它。
JSON_UNESCAPED_SLASHES (int)
不要转义 /
JSON_UNESCAPED_UNICODE (int)
按字面意思编码多字节 Unicode 字符(默认情况下为转义为 \uXXXX)。
JSON_PARTIAL_OUTPUT_ON_ERROR (int)
用一些不可编码的值替换,而不是失败。
JSON_PRESERVE_ZERO_FRACTION (int)
确保 float 值始终编码为浮点值。
JSON_UNESCAPED_LINE_TERMINATORS (int)
当提供 JSON_UNESCAPED_UNICODE 时,行终止符保持未转义。它使用与 PHP 7.1 之前没有此常量时相同的行为。从 PHP 7.1.0 开始可用。

以下常量可以组合起来为 json_decode()json_encode() 形成选项。

JSON_INVALID_UTF8_IGNORE (int)
忽略无效的 UTF-8 字符。从 PHP 7.2.0 开始可用。
JSON_INVALID_UTF8_SUBSTITUTE (int)
将无效的 UTF-8 字符转换为 \0xfffd(Unicode 字符“替换字符”)从 PHP 7.2.0 开始可用。
JSON_THROW_ON_ERROR (int)
如果发生错误,则抛出 JsonException,而不是设置使用 json_last_error()json_last_error_msg() 检索的全局错误状态。JSON_PARTIAL_OUTPUT_ON_ERROR 优先于 JSON_THROW_ON_ERROR。从 PHP 7.3.0 开始可用。
JSON_ERROR_NON_BACKED_ENUM (int)
传递给 json_encode() 的值包含一个无法序列化的非支持枚举。从 PHP 8.1.0 开始可用。
添加备注

用户贡献的备注 7 个备注

88
majid4466 at gmail dot com
8 年前
要获得一个真正干净的 json 字符串,请使用以下三个常量,例如

<?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 为 ["\u20ac","http:\/\/example.com\/some\/cool\/page","337"]
// $good 为 ["€","http://example.com/some/cool/page",337]
?>
30
nikospapoutsis
2 年前
在使用 majid4466 at gmail dot com 提供的代码或 JSON_NUMERIC_CHECK 时,请务必格外小心。

例如,在 php 7.4 和 8.1 中,如果 precision: 14 且 serialize_precision: -1,我们会得到以下结果:

<?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"]
// 在 $case1 中,欧元符号和 URL 都会改变,但我们也丢失了未加引号的浮点数的一个数字(由于精度)

["€",55.666666666666664,"http://example.com/some/cool/page","000337","55.6666666666666666"]
// 在 $case2 中,欧元符号和 URL 保持完全相同,但我们仍然丢失了未加引号的浮点数的一个数字(由于精度)

["€",55.666666666666664,"http://example.com/some/cool/page",337,55.666666666666664]
// 在 $case3 中,我们再次保留欧元符号和 URL 完好无损,但这次不仅未加引号的浮点数丢失了一个数字
// 而且加引号的浮点数也发生了同样的情况,并且数字/字符串也丢失了前导零

另外请注意,在 php 5.x 中,您可能会得到一些不同的但同样错误的结果,因为默认值可能不同,并且一些函数在内部也有所改变
70
Yzmir Ramirez
9 年前
如果您好奇常量的数值,截至 JSON 1.2.1,常量具有以下值(您不应该直接使用这些数字):

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
16
ASchmidt at Anamera dot net
6 年前
在多级数组中,JSON_FORCE_OBJECT 将把所有嵌套的数字数组编码为对象。

如果您的关注点仅仅是第一级数组(例如,使其适合作为 MySQL JSON 列),您可以将第一级数组强制转换为对象,例如:

<?php
$json
= json_encode( (object) $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

或者,如果您有大型数组并担心对象转换的开销,您可以将一个“null”值追加到数组大小之外,这将强制数组成为关联数组。

<?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 );
?>

当然,如果您后面的代码迭代数组,则必须将具有“NULL”值的元素与“!isset()”相同地对待。
-4
Anonymous
5 年前
flags JSON_NUMERIC_CHECK 和 JSON_PRESERVE_ZERO_FRACTION 在 php 7+ 中存在问题 - json_encode((float)8.8) 返回“8.8000000000000007”,而 json_encode((float)8.8, JSON_NUMERIC_CHECK) 和 json_encode((float)8.8, JSON_PRESERVE_ZERO_FRACTION) 也返回“8.8000000000000007”。

修复此问题的唯一方法是在 php.ini 中设置“serialize_precision = -1”。
-6
JuanP
8 年前
更新的格式值列表

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_PARTIAL_OUTPUT_ON_ERROR => 512
JSON_PRESERVE_ZERO_FRACTION => 1024
-35
on5wis at mac dot com
9 年前
由于 json_encode 期望一个 UTF-8 字符串,因此无需对 € 符号进行编码。

我建议您尝试回显:json_encode('€');
它给出:"\u20ac"
我在 CLI 上运行的是 PHP 5.6.5,在 MacOS X 10.10 上。
To Top