PHP JSON 处理:JSON 解码 JSON_decode
PHP 的 json_decode
函数接受一个 JSON 编码的字符串并且把它转换为 PHP 变量。JSON 数据通常用于表示 JavaScript 数组或对象字面量。反之, json_decode
将 JSON 字符串转化为 PHP 数组或对象。以下将分别以数组和对象为例进行演示
$json = '["apple","orange","banana","strawberry"]';
$ar = json_decode($json);
// 访问数组的第一个元素
echo $ar[0]; // apple
通过 json_decode
方法, 对象字面量将默认转化为标准的 PHP 对象
$json = '{
"title": "JavaScript: The Definitive Guide",
"author": "David Flanagan",
"edition": 6
}';
$book = json_decode($json);
// access title of $book object
echo $book->title; // JavaScript: The Definitive Guide
将 JSON 字符串转换为 PHP 数组
json_decode
函数提供了可选的第二个参数,用于将对象转换为关联数组。下面使用上一个示例中的对象,并将 true
作为第二个参数传入函数。$book现在得到的结果便是一个数组,可以使用数组语法访问它的title元素和其他元素:
// 和上面例子中一样的$json
// 通过true参数将 JSON 字符串转换为 PHP 数组
$book = json_decode($json, true);
// 得到$book 数组的 title
echo $book['title']; // JavaScript: The Definitive Guide
JSON 字符串转换到多维数组
json_decode
函数还可用于转换 JSON 字符串中包含的更复杂的数据结构。以下示例中的 JSON 字符串($json
)表示一个对象数组。也就是说,外层是一个数组,数组元素是一个个对象。默认情况下 json_decode
的结果是对象组成的以数字为索引的数组:
$json = '[
{
"title": "Professional JavaScript",
"author": "Nicholas C. Zakas"
},
{
"title": "JavaScript: The Definitive Guide",
"author": "David Flanagan"
},
{
"title": "High Performance JavaScript",
"author": "Nicholas C. Zakas"
}
]';
$books = json_decode($json);
// 取得对象数组的属性
echo $books[1]->title; // JavaScript: The Definitive Guide
如果我们将 true 作为第二个参数传递给 json_decode
,则结果是一个多维数组,外层被数字索引的数组,内层是关联数组:
// 和上面例子中一样的$json
// 通过true参数将 JSON 字符串转换为多维数组
$books = json_decode($json, true);
// 索引(数字/关联的键)多维数组
echo $books[1]['title']; // JavaScript: The Definitive Guide
然后,我们使用数字和关联数组语法的组合来访问多维数组中的你想要的元素。
json_decode错误或意外结果?
如果传递给 json_decode
函数的字符串无法转换,则返回值为null。例如,以下示例说明了我们的 JSON 字符串包含不合法的字符时的结果:
$json = "{
'title': 'JavaScript: The Definitive Guide',
'author': 'David Flanagan',
'edition': 6
}";
$book = json_decode($json);
echo $book->title; // Notice: Trying to get property of non-object...
echo json_last_error(); // 4 (JSON_ERROR_SYNTAX)
echo json_last_error_msg(); // unexpected character
我们尝试访问对象的属性会导致错误。PHP中的 json_last_error
和 json_last_error_msg
函数提供了相关的错误信息。