当前位置: 首页 > 面试题库 >

如何使用PHP从JSON提取数据?

闾丘选
2023-03-14
问题内容

这旨在作为一般参考问题和答案,涵盖许多永无止境的 “如何访问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是基于文本的序列化格式,因此是花哨的字符串,但仍然只是字符串。使用解码PHPjson_decode()

 $data = json_decode($json);

在其中您可能会发现:

  • 标量:strings,ints,floats和bools
  • 空值(其自身的一种特殊类型)
  • 复合类型:对象和数组。

这些都是可以用JSON编码的东西。或更准确地说,这些是可以用JSON编码的PHP版本。

他们没有什么特别的。它们不是“ 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";
}

Glazed
Chocolate with Sprinkles
Maple

或与任何成千上万个内置数组函数混为一谈。

访问嵌套项

对象的属性和数组的元素可能是更多的对象和/或数组-您可以像往常一样继续访问它们的属性和成员,例如$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的服务存在错误),并使其不会发生。

对象属性名称包含特殊字符

有时,您会有一个对象属性名称,其中包含连字符-或符号@,但不能在文字标识符中使用。相反,您可以在花括号中使用字符串文字来解决它。

$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()无法立即处理,那么事情就会变得棘手。



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

  • 问题内容: 我正在尝试从subreddit提要中提取图像发布URL,并在页面上呈现元素。 一段时间以来,我一直在尝试从jQuery Docs中窃取 Flickr示例,但我一无所获。 有问题的代码: 在体内,我具有以下元素: 我了解我需要使用JSONP,但不确定如何使用。有人可以指出我正确的方向吗? 问题答案: 您使用的网址错误。用这个: 编辑: 基于您的评论中的小提琴的工作示例。 你应该使用而不是

  • 我正在创建一个fetchBill函数。分配https://randomapi.com/api/006b08a801d82d0c9824dcfdfdfa3b3c到一个api变量。它使用浏览器的fetch函数向api发出HTTP请求。它在一个函数中使用箭头函数。然后调用fetch函数,并在将其转换为JSON后返回响应。使用另一个。然后调用第一个函数,该函数将JSON数据传递给displayCartTo

  • 问题内容: 我正在尝试使用PHP从以下JSON文件中获取数据。我特别想要“ temperatureMin”和“ temperatureMax”。 这可能真的很简单,但是我不知道该怎么做。我被困在file_get_contents(“ file.json”)之后该做什么。一些帮助将不胜感激! 问题答案: 使用以下命令获取JSON文件的内容: 现在使用解码JSON : 您有一个包含所有信息的关联数组。

  • 示例:第一个JSON对象{“test1”:{“name”:“sam”,“address”:“hyd”,“email”:“sam@123.com”},“test2”:{“name”:“josh”,“address”:“usa”,“email”:“josh@123.com”}} 示例:第二个JSON对象{“test1”:{“name”:“sam”,“address”:“hyd”,“email”:“sa

  • 问题内容: 我是JSON格式的新手,在阅读的教程中,我不太了解如何使用php进行解析。所以我有这个: 我想回显 坐标 和 reverseGeocode 。谁能请我朝正确的方向前进? 问题答案: 尝试跑步 您的示例JSON作为字符串在哪里。