编码 JSON 字符串

json_encode 功能将转换 PHP 阵列(或,由于 PHP 5.4,它实现了 JsonSerializable 接口的对象),以一个 JSON 编码的字符串。它在成功时返回 JSON 编码的字符串,在失败时返回 FALSE。

$array = [
    'name' => 'Jeff',
    'age' => 20,
    'active' => true,
    'colors' => ['red', 'blue'],
    'values' => [0=>'foo', 3=>'bar'],
];

在编码期间,PHP 数据类型字符串,整数和布尔值将转换为它们的 JSON 等效项。关联数组被编码为 JSON 对象,并且 - 当使用默认参数调用时 - 索引数组被编码为 JSON 数组。 (除非数组键不是从 0 开始的连续数字序列,否则数组将被编码为 JSON 对象。)

echo json_encode($array);

输出:

{"name":"Jeff","age":20,"active":true,"colors":["red","blue"],"values":{"0":"foo","3":"bar"}}

参数

从 PHP 5.3 开始,json_encode 的第二个参数是一个位掩码,它可以是以下一个或多个。

与任何位掩码一样,它们可以与二进制 OR 运算符|结合使用。

PHP 5.x >= 5.3

JSON_FORCE_OBJECT

强制创建对象而不是数组

$array = ['Joel', 23, true, ['red', 'blue']];
echo json_encode($array);
echo json_encode($array, JSON_FORCE_OBJECT);

输出:

["Joel",23,true,["red","blue"]]
{"0":"Joel","1":23,"2":true,"3":{"0":"red","1":"blue"}}

JSON_HEX_TAGJSON_HEX_AMPJSON_HEX_APOSJSON_HEX_QUOT

确保在编码期间进行以下转换:

不变 输入 输出
JSON_HEX_TAG < \u003C
JSON_HEX_TAG > \u003E
JSON_HEX_AMP & \u0026
JSON_HEX_APOS ' \u0027
JSON_HEX_QUOT " \u0022
$array = ["tag"=>"<>", "amp"=>"&", "apos"=>"'", "quot"=>"\""];
echo json_encode($array);
echo json_encode($array, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);

输出:

{"tag":"<>","amp":"&","apos":"'","quot":"\""}
{"tag":"\u003C\u003E","amp":"\u0026","apos":"\u0027","quot":"\u0022"}
PHP 5.x >= 5.3

JSON_NUMERIC_CHECK

确保将数字字符串转换为整数。

$array = ['23452', 23452];
echo json_encode($array);
echo json_encode($array, JSON_NUMERIC_CHECK);

输出:

["23452",23452]    
[23452,23452]
PHP 5.x >= 5.4

JSON_PRETTY_PRINT

使 JSON 易于阅读

$array = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
echo json_encode($array);
echo json_encode($array, JSON_PRETTY_PRINT);

输出:

{"a":1,"b":2,"c":3,"d":4}
{
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4
}

JSON_UNESCAPED_SLASHES

包括输出中未转义的/正斜杠

$array = ['filename' => 'example.txt', 'path' => '/full/path/to/file/'];
echo json_encode($array);
echo json_encode($array, JSON_UNESCAPED_SLASHES);

输出:

{"filename":"example.txt","path":"\/full\/path\/to\/file"}
{"filename":"example.txt","path":"/full/path/to/file"}

JSON_UNESCAPED_UNICODE

在输出中包含 UTF8 编码的字符,而不是\u 编码的字符串

$blues = ["english"=>"blue", "norwegian"=>"blå", "german"=>"blau"];
echo json_encode($blues);
echo json_encode($blues, JSON_UNESCAPED_UNICODE);

输出:

{"english":"blue","norwegian":"bl\u00e5","german":"blau"}
{"english":"blue","norwegian":"blå","german":"blau"}
PHP 5.x >= 5.5

JSON_PARTIAL_OUTPUT_ON_ERROR

如果遇到某些不可编码的值,则允许编码继续。

$fp = fopen("foo.txt", "r");
$array = ["file"=>$fp, "name"=>"foo.txt"];
echo json_encode($array); // no output
echo json_encode($array, JSON_PARTIAL_OUTPUT_ON_ERROR);

输出:

{"file":null,"name":"foo.txt"}
PHP 5.x >= 5.6

JSON_PRESERVE_ZERO_FRACTION

确保浮点数始终编码为浮点数。

$array = [5.0, 5.5];
echo json_encode($array);
echo json_encode($array, JSON_PRESERVE_ZERO_FRACTION);

输出:

[5,5.5]
[5.0,5.5]
PHP 7.x >= 7.1

JSON_UNESCAPED_LINE_TERMINATORS

当与 JSON_UNESCAPED_UNICODE 一起使用时,恢复到较旧 PHP 版本的行为,并且不会转义字符 U + 2028 LINE SEPARATOR 和 U + 2029 PARAGRAPH SEPARATOR。尽管在 JSON 中有效,但这些字符在 JavaScript 中无效,因此在版本 7.1 中更改了 JSON_UNESCAPED_UNICODE 的默认行为。

$array = ["line"=>"\xe2\x80\xa8", "paragraph"=>"\xe2\x80\xa9"];
echo json_encode($array, JSON_UNESCAPED_UNICODE);
echo json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_LINE_TERMINATORS);

输出:

{"line":"\u2028","paragraph":"\u2029"}
{"line":"
","paragraph":"
"}