json_encode() 是 PHP 中用于将 PHP 数据结构(如数组或对象)转换成 JSON 格式字符串的函数。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,也易于机器解析和生成。

基本语法

string json_encode(mixed $value, int $flags = 0, int $depth = 512);

  • $value: 必须。需要编码为 JSON 的数据,可以是数组、对象、字符串、数字等。
  • $flags: 可选。一个或多个位掩码常量,控制编码过程的行为。常用的标志包括:
    • JSON_HEX_TAG: 将 <> 转换为 \u003C\u003E
    • JSON_HEX_AMP: 将 & 转换为 \u0026
    • JSON_HEX_APOS: 将 ' 转换为 \u0027
    • JSON_HEX_QUOT: 将 " 转换为 \u0022
    • JSON_FORCE_OBJECT: 将数组强制转换为对象(即使数组是数字索引的)。
    • JSON_PRETTY_PRINT: 格式化输出,增加可读性。
    • JSON_UNESCAPED_SLASHES: 不对斜杠 / 进行转义。
    • JSON_UNESCAPED_UNICODE: 不对 Unicode 字符进行转义。
  • $depth: 可选。设置递归的最大深度,默认值为 512。若数据层级太深,可能导致溢出或错误。

返回值

返回一个 JSON 编码后的字符串,失败时返回 false

示例

1. 将数组转换为 JSON 字符串

&lt;?php
$data = array("name" => "John", "age" => 30, "city" => "New York");
$json = json_encode($data);
echo $json; // 输出: {"name":"John","age":30,"city":"New York"}
?>

2. 将对象转换为 JSON 字符串

&lt;?php
class Person {
    public $name;
    public $age;
    
    function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
}

$person = new Person("John", 30);
$json = json_encode($person);
echo $json; // 输出: {"name":"John","age":30}
?>

3. 使用 JSON_PRETTY_PRINT 格式化输出

&lt;?php
$data = array("name" => "John", "age" => 30, "city" => "New York");
$json = json_encode($data, JSON_PRETTY_PRINT);
echo $json;
// 输出:
// {
//     "name": "John",
//     "age": 30,
//     "city": "New York"
// }
?>

4. 处理非 UTF-8 编码的字符串

如果输入数据包含非 UTF-8 编码的字符,json_encode() 会失败。你可以使用 JSON_UNESCAPED_UNICODE 标志来避免编码 Unicode 字符。

&lt;?php
$data = array("message" => "你好,世界!");
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
echo $json; // 输出: {"message":"你好,世界!"}
?>

5. 将数组强制转换为对象

如果你传递一个索引数组(数字索引),默认情况下 json_encode() 会将其转换为 JSON 数组。如果你希望它以对象的形式表示,可以使用 JSON_FORCE_OBJECT 标志。

&lt;?php
$data = array(1, 2, 3);
$json = json_encode($data, JSON_FORCE_OBJECT);
echo $json; // 输出: {"0":1,"1":2,"2":3}
?>

错误处理

json_encode() 函数在处理过程中可能会发生错误。例如,如果输入数据包含无法编码的字符,或者递归层次过深,会返回 false。你可以使用 json_last_error() 函数检查错误。

&lt;?php
$data = "\xB1\x31";  // 无法编码的字符
$json = json_encode($data);

if ($json === false) {
    echo "JSON 编码失败: " . json_last_error_msg();
} else {
    echo $json;
}
// 输出: JSON 编码失败: Malformed UTF-8 characters, possibly incorrectly encoded
?>

常见问题

  • json_encode 不支持循环引用的对象:如果对象中包含循环引用(即对象 A 引用对象 B,而对象 B 又引用对象 A),json_encode() 会失败并返回 false。需要小心处理对象之间的引用。
  • 编码大数字时的精度问题json_encode() 可能会在处理非常大的整数时丢失精度。为了避免这个问题,可以使用 JSON_PRESERVE_ZERO_FRACTION 标志。

总结

  • json_encode() 是 PHP 中用于将数据编码为 JSON 格式的强大工具。
  • 可以通过设置 flags 参数来定制编码行为。
  • 结合 json_last_error() 可以有效地处理编码错误。

如果你有更复杂的用法或具体问题,随时可以提问!