提问人:user3942918 提问时间:3/28/2015 最后编辑:AbraCadaveruser3942918 更新时间:8/3/2023 访问量:469998
如何使用PHP从JSON中提取和访问数据?
How to extract and access data from JSON with 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 中解码并访问结果数据?
答:
介绍
首先,你有一个字符串。JSON 不是数组、对象或数据结构。JSON是一种基于文本的序列化格式 - 所以是一个花哨的字符串,但仍然只是一个字符串。使用 json_decode()
在 PHP 中对其进行解码。
$data = json_decode($json);
您可能会在其中找到:
这些是可以用 JSON 编码的东西。或者更准确地说,这些是PHP的版本,可以用JSON编码。
他们没有什么特别的。它们不是“JSON 对象”或“JSON 数组”。您已经解码了 JSON - 您现在拥有了基本的日常 PHP 类型。
对象将是 stdClass 的实例,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 的任何内容。
看看 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 资源管理器中查看它。
将问题分解成更容易理解的部分。
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 中对数组和数据进行排序的所有基本方法。
评论
<?php
$jsonData = '{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
// Decode the JSON
$data = json_decode($jsonData, true);
// Access the data
$type = $data['type'];
$name = $data['name'];
$toppings = $data['toppings'];
// Access individual topping details
$firstTopping = $toppings[0];
$firstToppingId = $firstTopping['id'];
$firstToppingType = $firstTopping['type'];
// Print the data
echo "Type: $type\n";
echo "Name: $name\n";
echo "First Topping ID: $firstToppingId\n";
echo "First Topping Type: $firstToppingType\n";
?>
在此示例中,json_decode() 用于将 JSON 数据解码为 PHP 关联数组。然后,您可以像访问任何 PHP 数组一样访问数组的各个元素。
评论