问题描述
介绍
首先你有一个字符串。JSON 不是数组、对象或数据结构。JSON是一种基于文本的序列化格式 -
所以是一个花哨的字符串,但仍然只是一个字符串。在 PHP 中使用json_decode()
.
$data = json_decode($json);
其中你可能会发现:
这些是可以用 JSON 编码的东西。或者更准确地说,这些是可以用 JSON 编码的 PHP 版本。
他们没有什么特别的。它们不是“JSON 对象”或“JSON 数组”。您已经对 JSON 进行了解码——您现在拥有了基本的日常 PHP 类型。
对象将是stdClass的实例,这是一个内置类,它只是一个通用的东西,在这里并不重要。
访问对象属性
您访问这些对象之一的属性的方式与访问任何其他对象的公共非静态属性的方式相同,例如$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
true
作为第二个参数传递给json_decode()
当您这样做时,您将获得关联数组而不是对象 - 带有字符串的数组作为键。您再次像往常一样访问其中的元素,例如$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 value’ 键’bar’的值是’bar value’ 键’baz’的值是’baz value’
不知道数据的结构
看看 JSON - 你看到大括号{}
需要一个对象,你看到方括号[]
需要一个数组。
用 a 击中解码的数据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 资源管理器中查看它。
将问题分解成更容易理解的部分。
json_decode()
返回null
发生这种情况是因为:
- JSON 完全由
null
. - JSON 无效 - 检查结果
json_last_error_msg
或将其放入JSONLint之类的内容。 - 它包含嵌套超过 512 层的元素。这个默认的最大深度可以通过将整数作为第三个参数传递给
json_decode()
.
如果您需要更改最大深度,您可能正在解决错误的问题。找出为什么你会得到如此深的嵌套数据(例如,你正在查询的生成 JSON 的服务有一个错误)并让它不会发生。
对象属性名称包含特殊字符
有时你会有一个对象属性名称,其中包含不能在文字标识符中使用的连字符-
或 at 符号之类的东西。@
相反,您可以在花括号内使用字符串文字来解决它。
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
如果您有一个整数作为属性,请参阅:如何访问具有整数等名称的对象属性?作为参考。
有人将 JSON 放入您的 JSON
这很荒谬,但它发生了——在你的 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()
无法立即处理,事情就会开始变得棘手。看:
如何排序
请参阅:参考:在 PHP 中对数组和数据进行排序的所有基本方法。
解决方法
这是一个通用的参考问题和答案,涵盖了许多永无止境的 “如何访问我的 JSON 中的数据?” 问题。它在这里处理在 PHP 中解码 JSON
和访问结果的广泛基础知识。
我有 JSON:
{
"type": "donut","name": "Cake","toppings": [
{ "id": "5002","type": "Glazed" },{ "id": "5006","type": "Chocolate with Sprinkles" },{ "id": "5004","type": "Maple" }
]
}
如何在 PHP 中对此进行解码并访问结果数据?