了解PHP JSON编码和解码

发布时间:2023-05-11
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,它易于人阅读和编写,同时也易于机器理解和生成。PHP提供了json_encode()函数和json_decode()函数来实现JSON的编码和解码。接下来,将从以下几个方面为您讲解PHP JSON编码和解码。

一、JSON的概述

JSON是一种轻量级数据交换格式,它以文本的方式进行数据编码,可被解析成Javascript对象。JSON采用了类似于C语言的语法,这使得JSON数据在各种编程语言中都是易于理解的。

JSON数据由两种结构构成:键值对和数组。键值对表示为{key:value},数组表示为[value1,value2,value3]。

二、json_encode()函数

json_encode()函数用于将PHP中的数据转换为JSON格式的字符串。

下面是一个例子:

$data = array(
    "name" => "Tom",
    "age" => 18,
    "sex" => "male"
);
$jsonStr = json_encode($data);
echo $jsonStr;

上述代码将$data数组转换为JSON格式的字符串,并输出。输出结果为:

{"name":"Tom","age":18,"sex":"male"}

三、json_decode()函数

json_decode()函数用于将JSON格式的字符串转换为PHP中的变量。

下面是一个例子:

$jsonStr = '{"name":"Tom","age":18,"sex":"male"}';
$data = json_decode($jsonStr, true);
print_r($data);

上述代码将JSON格式的字符串$jsonStr转换为PHP中的变量,并用print_r()函数输出。输出结果为:

Array
(
    [name] => Tom
    [age] => 18
    [sex] => male
)

四、处理JSON数据中的中文字符

由于JSON数据是以Unicode字符集输出的,所以中文字符必须进行编码后才能正确传输。而json_encode()函数中存在第二个参数$options,可以通过设置JSON_UNESCAPED_UNICODE常量来解决处理JSON数据中的中文字符。

下面是一个例子:

header('Content-Type:application/json;charset=utf-8');
$data = array(
    "name" => "张三",
    "age" => 20,
    "sex" => "男"
);
$jsonStr = json_encode($data, JSON_UNESCAPED_UNICODE);
echo $jsonStr;

上述代码将$data数组转换为JSON格式的字符串,并用echo输出。其中用header()函数设置响应头Content-type,防止中文乱码。输出结果为:

{"name":"张三","age":20,"sex":"男"}

五、处理含有对象或数组的JSON数据

在JSON数据中,可以包含对象或数组等复杂的数据结构,其编码和解码也比较简单。在json_encode()函数中,只需将包含对象和数组的变量转换为PHP中的对象或数组即可;在json_decode()函数中,只需通过第二个参数指定返回值类型即可。

下面是一个例子:

$data = array(
    "name" => "Tom",
    "age" => 18,
    "hobbies" => array("reading","music"),
    "address" => (object)array("province"=>"Guangdong","city"=>"Shenzhen","district"=>"Nanshan")
);
$jsonStr = json_encode($data);
echo $jsonStr;
echo "\n";
$obj = json_decode($jsonStr);
print_r($obj);
echo "\n";
$assocArr = json_decode($jsonStr, true);
print_r($assocArr);

上述代码中,$data数组中包含一个hobbies数组和一个address对象。用json_encode()函数将其转换为JSON格式的字符串,用echo输出。用json_decode()函数将其转换为对象和数组,并用print_r()函数输出。输出结果为:

{"name":"Tom","age":18,"hobbies":["reading","music"],"address":{"province":"Guangdong","city":"Shenzhen","district":"Nanshan"}}
stdClass Object
(
    [name] => Tom
    [age] => 18
    [hobbies] => Array
        (
            [0] => reading
            [1] => music
        )
    [address] => stdClass Object
        (
            [province] => Guangdong
            [city] => Shenzhen
            [district] => Nanshan
        )
)
Array
(
    [name] => Tom
    [age] => 18
    [hobbies] => Array
        (
            [0] => reading
            [1] => music
        )
    [address] => Array
        (
            [province] => Guangdong
            [city] => Shenzhen
            [district] => Nanshan
        )
)

六、JSONPath的使用

JSONPath是一种用于在JSON数据中选取数据的表达式,类似于XPath用于XML。使用JSONPath后,我们可以通过一个表达式来调整数据并从中提取出所需的值。

使用JSONPath需要导入第三方类库。下面是一个例子:

假设有以下JSON字符串:

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}

要从中提取出“Sword of Honour”的书名和价格,JSONPath表达式为$store.book[1].title和$store.book[1].price。代码如下:

use Flow\JSONPath\JSONPath;

$jsonStr = '{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}';
$json = json_decode($jsonStr);
$jsonPath = new JSONPath($json);
$title = $jsonPath->find('$store.book[1].title')[0];
$price = $jsonPath->find('$store.book[1].price')[0];
echo "书名:".$title."\n";
echo "价格:".$price."\n";

输出结果为:

书名:Sword of Honour
价格:12.99

结语

通过本文的讲解,您已经了解了PHP JSON编码和解码的相关知识。同时,您也学会了如何处理JSON数据中的中文字符和含有对象或数组的JSON数据,以及如何使用JSONPath从JSON数据中提取所需的数据。