JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

想要用 PHP 操作 JSON 就离不开下面两个函数:

json_decode();  //  对JSON格式的字符串进行解码
json_encode();  //  对变量进行 JSON 编码

这里先说 json_decode 对 JSON 格式的字符串进行解码,前端上传的 JSON 数据对于 PHP 来说就是字符串,json_decode 可以把 JSON 字符串转换为 PHP 对象。

JSON 解码 & 操作

下面是一个 PHP 写的 JSON 字符串:

$json = '{"user": "Administrator", "password": "123456"}';

如果不经过转换是不能直接操作的,即使用正则表达式也很难,如果直接输出的话还是一样的字符串:

{"user": "Administrator", "password": "123456"}

这里就需要用到 json_decode 来转换,需要传入要转换的 JSON 字符串,返回转换后的 PHP 对象:

$json = '{"user": "Administrator", "password": "123456"}';  //  JSON字符串
$json = json_decode($json);  //  JSON字符串解码

现在就可以操作这个 JSON 对象了:

echo $json->user;  //  输出用户
echo $json->password;  //  输出密码

这是一个很简单的 JSON 数据,JSON 数据是可以包含数组和多层嵌套的,

下面是一个稍微有点难度的 JSON 数据:

{
    "user": "Administrator",
    "password": "123456",
    "phone_num": [
        "13011112222",
        "15522222222",
        "13988888888"
    ],
    "friends": [
        {
            "name": "马云",
            "age": "54"
        },
        {
            "name": "马化腾",
            "age": "47"
        },
        {
            "name": "李彦宏",
            "age": "50"
        }
    ]
}
echo $json->user;  //  输出用户
echo $json->password;  //  输出密码

for($i = 0;$i < count($json->phone_num);$i ++) {
    echo $json->phone_num[$i];  //  输出手机号
}

for ($i = 0;$i < count($json->friends);$i ++) {
    echo $json->friends[$i]->name;  //  输出好友名字
    echo $json->friends[$i]->age;  //  输出好友年龄
}

JSON 的字段名和值用冒号分隔,数组写在方括号里,对象写在花括号里,JSON对 象里可以包含数组,数组里也可以包含 JSON 对象,只要知道了 JSON 的语法结构,无论在复杂的 JSON 数据也能迎刃而解。

JSON 编码

最后来说一下 json_encode 对 PHP 变量进行 JSON 编码,也就是把 PHP 变量或对象转换为 JSON 字符串,常用于输出数据给前端。通常情况下在数据库查询出数据后为了便于操作都会把数据转换为 PHP 数组,可以直接输出到页面,但如果前端使用 AJAX 请求的话就不能直接输出数组了,这时候就需要用 json_encode 把数组转换为 JSON 字符串,方便前端解析。

下面是一个 PHP 数组:

$data = array(
    array(
        "name" => "小明",
        "age" => 10
    ),
    array(
        "name" => "小强",
        "age" => 8
    ),
    array(
        "name" => "小李",
        "age" => 10
    )
);

如果直接用 print_r 输出的话前端是不能解析的,这里使用 json_encode 对数组进行编码:

$data = json_encode($data);

传入要编码的 PHP 变量或对象,返回编码后的 JSON 字符串,下面是经过 JSON 编码后的效果:

[
    {
        "name": "小明",
        "age": 10
    },
    {
        "name": "小强",
        "age": 8
    },
    {
        "name": "小李",
        "age": 10
    }
]

前端收到这个 JSON 字符串后在把这个字符串转换为 JSON 对象就可以使用了。