一、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数据中提取所需的数据。