这是一个通用的参考问答,涵盖了许多永无止境的“如何访问 JSON 中的数据?”问题。它在这里处理解码 JSON 的广泛基础知识...
本指南旨在提供一般参考问答,涵盖许多永无止境的 “如何访问 JSON 中的数据?” 问题。本指南旨在处理在 PHP 中解码 JSON 和访问结果的广泛基础知识。
我有 JSON:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
如何在 PHP 中解码它并访问结果数据?
首先,你有一个字符串。是一种基于文本的序列化格式 - 因此是一个花哨的字符串,但仍然只是一个字符串。使用 不是数组、对象或数据结构。JSON JSON 在 json_decode()
.
$data = json_decode($json);
您可能会发现:
这些是可以用 JSON 编码的内容。或者更准确地说,这些是可以用 JSON 编码的内容的 PHP 版本。
它们没有什么特别之处。它们不是“JSON 对象”或“JSON 数组”。您已经解码了 JSON - 现在您有了 基本的日常 PHP 类型 .
对象将是 stdClass ,stdClass 是一个内置类,它只是一个 通用的东西 ,在这里并不重要。
可以像访问其他对象的公共非静态属性一样 properties 属性 $object->property
.
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
你可以像访问其他数组一样访问这些数组的元素,例如 $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
使用 foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
釉面
巧克力碎
枫
或者使用无数 内置数组函数 .
对象的属性和数组的元素可能是更多的对象和/或数组 - 您可以像往常一样继续访问它们的属性和成员,例如 $object->array[0]->etc
.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
echo $yummy->toppings[2]->id; //5004
执行此操作后,您将获得关联数组(以字符串为键的数组),而不是对象。同样,您可以像往常一样访问其中的元素,例如 $array['key']
.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json, true);
echo $yummy['toppings'][2]['type']; //Maple
将 JSON 对象 为关联 PHP 数组时,可以使用 foreach (array_expression as $key => $value)
语法迭代键和值,例如
$json = '
{
"foo": "foo value",
"bar": "bar value",
"baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
echo "The value of key '$key' is '$value'", PHP_EOL;
}
印刷
键“foo”的值是“foo 值”
键 'bar' 的值为 'bar value'
键 'baz' 的值是 'baz value'
无论你从哪里获取 JSON,请阅读文档。
看看 JSON - 你会看到大括号中 {}
代表一个对象,你会看到方括号中 []
代表一个数组。
打印解码后的数据 print_r()
:
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
print_r($yummy);
并检查输出:
stdClass Object
(
[type] => donut
[name] => Cake
[toppings] => Array
(
[0] => stdClass Object
(
[id] => 5002
[type] => Glazed
)
[1] => stdClass Object
(
[id] => 5006
[type] => Chocolate with Sprinkles
)
[2] => stdClass Object
(
[id] => 5004
[type] => Maple
)
)
)
它会告诉您对象在哪里、数组在哪里,以及它们的成员的名称和值。
如果你在迷路之前只能走这么远——那就走那么远, 然后 用 print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
这个方便的交互式 JSON 浏览器 中查看它 .
将问题分解成更容易理解的部分。
发生这种情况是因为:
null
.
json_last_error_msg
或将其放入 JSONLint .
json_decode()
.
如果您需要更改最大深度,那么您可能解决了错误的问题。找出您获取如此深层嵌套数据的原因(例如,您查询的生成 JSON 的服务有错误)并避免这种情况发生。
有时,对象属性名称中包含连字符 -
或 at 符号 @
,而这些符号不能用作文字标识符。您可以改用花括号内的字符串文字来处理它。
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
如果您有一个整数作为属性,请参见: 如何访问具有整数等名称的对象属性? 作为参考。
这很荒谬,但确实发生了 - JSON 中有一个 JSON 编码为字符串。解码,照常访问字符串,解码 它 ,最终得到您需要的内容。
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';
$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);
echo $toppings[0]->type; //Glazed
如果您的 JSON 太大而无法 json_decode()
一次处理,事情就会变得棘手。请参阅: