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

How to extract and access data from JSON with PHP?

提问人:user3942918 提问时间:3/28/2015 最后编辑:AbraCadaveruser3942918 更新时间:8/3/2023 访问量:469989

问:

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

我有JSON:

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

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

PHP 的JSON

评论

2赞 hakre 3/28/2015
相关:能够在 print_r() 的输出中看到变量,但不确定如何在代码中访问它,可以在 PHP 上下文中进行交互式 JSON 探索:array.include-once.org
1赞 I am the Most Stupid Person 8/9/2017
请问我为什么这个问题不被视为重复问题,即使有 9 个或更少的用户标记为重复 stackoverflow.com/questions/4343596/parsing-json-file-with-php?M
0赞 Félix Adriyel Gagnon-Grenier 2/26/2018
@IamtheMostStupidPerson我会试着解释一下,即使你的用户名让我怀疑你会得到它;)。这个问题是以“规范”的方式提出的,它的答案是写出来的。因此,与其他问题相比,它是重复目标的更好接收者。

答:

594赞 user3942918 3/28/2015 #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";
}


面巧克力配枫

或者弄乱任何数以百万计的内置数组函数


访问嵌套项

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

发生这种情况的原因是:

  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 中对数组和数据进行排序的所有基本方法

评论

0赞 Jeff 9/23/2017
只是偶然发现这个答案,发现 array.include-once.org 的链接坏了。
3赞 Jatin Dahiya 8/3/2023 #2
<?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 数组一样访问数组的各个元素。