如何使用PHP从JSON中提取和访问数据?

2022-08-30 06:07:38

这是一个通用的参考问题和答案,涵盖了许多永无止境的“如何访问JSON中的数据?”问题。在这里处理在PHP中解码JSON和访问结果的广泛基础知识。

我有 JSON:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

如何在PHP中解码并访问结果数据?


答案 1

介绍

首先,你有一个字符串。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";
}

釉面
巧克力与洒
枫木

或者搞砸任何一个 bazillion 内置数组函数


访问嵌套项目

对象的属性和数组的元素可能是更多的对象和/或数组 - 您可以像往常一样继续访问它们的属性和成员,例如.$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为$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值'
键'baz'的值是'baz值'


不知道数据是如何构建的

阅读文档,了解从中获取 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() 返回空值

发生这种情况是因为:

  1. JSON 完全由 .null
  2. JSON是无效的 - 检查json_last_error_msg的结果或将其放入JSONLint之类的东西。
  3. 它包含嵌套深度超过 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 中对数组和数据进行排序的所有基本方法


答案 2

推荐