如何使用PHP从JSON提取数据? [英] How do I extract data from JSON with PHP?

查看:177
本文介绍了如何使用PHP从JSON提取数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这旨在作为一般参考问题和答案,涵盖许多永无止境的如何访问JSON中的数据?" 问题.在这里可以处理在PHP中解码JSON和访问结果的广泛基础.

This is intended to be a general reference question and answer covering many of the never-ending "How do I access data in my JSON?" questions. It is here to handle the broad basics of decoding JSON in PHP and accessing the results.

我有JSON:

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

如何在PHP中对此进行解码并访问结果数据?

How do I decode this in PHP and access the resulting data?

推荐答案

简介

首先,您有一个字符串. JSON不是数组,对象或数据结构. JSON 是一种基于文本的序列化格式,因此是花哨的字符串,但仍然只是字符串.通过使用 json_decode() 在PHP中对其进行解码.

Intro

First off you have a string. JSON is not an array, an object, or a data structure. JSON is a text-based serialization format - so a fancy string, but still just a string. Decode it in PHP by using json_decode().

 $data = json_decode($json);

您可能会发现:

  • scalars: strings, ints, floats, and bools
  • nulls (a special type of its own)
  • compound types: objects and arrays.

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

These are the things that can be encoded in JSON. Or more accurately, these are PHP's versions of the things that can be encoded in JSON.

它们没有什么特别的.它们不是"JSON对象"或"JSON数组".您已经解码了JSON-现在有了基本的日常PHP类型.

There's nothing special about them. They are not "JSON objects" or "JSON arrays." You've decoded the JSON - you now have basic everyday PHP types.

对象将是 stdClass 的实例,该内置类是只是一般的东西,在这里并不重要.

Objects will be instances of stdClass, a built-in class which is just a generic thing that's not important here.

您可以以相同的方式访问这些对象之一的属性您将使用其他任何对象的公共非静态属性,例如$object->property.

You access the properties of one of these objects the same way you would for the public non-static properties of any other object, e.g. $object->property.

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut


访问数组元素

您可以像访问任何其他数组一样的方式访问这些数组之一的元素,例如 $array[0] .


Accessing array elements

You access the elements of one of these arrays the same way you would for any other array, e.g. $array[0].

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

使用 foreach 对其进行迭代.

Iterate over it with foreach.

foreach ($toppings as $topping) {
    echo $topping, "\n";
}

釉面
洒巧克力

Glazed
Chocolate with Sprinkles
Maple

或者与任何庞大的内置数组函数混在一起.

Or mess about with any of the bazillion built-in array functions.

对象的属性和数组的元素可能是更多的对象和/或数组-您可以像往常一样简单地继续访问它们的属性和成员. $object->array[0]->etc.

The properties of objects and the elements of arrays might be more objects and/or arrays - you can simply continue to access their properties and members as usual, e.g. $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'].


Passing true as the second argument to json_decode()

When you do this, instead of objects you'll get associative arrays - arrays with strings for keys. Again you access the elements thereof as usual, e.g. $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数组时,可以使用


Accessing associative array items

When decoding a JSON object to an associative PHP array, you can iterate both keys and values using the foreach (array_expression as $key => $value) syntax, eg

$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"

The value of key 'foo' is 'foo value'
The value of key 'bar' is 'bar value'
The value of key 'baz' is 'baz value'


不知道数据的结构方式

阅读文档以获取从中获取JSON的信息.


Don't know how the data is structured

Read the documentation for whatever it is you're getting the JSON from.

看看JSON-在哪里看到大括号{}期望一个对象,在哪里看到方括号[]期望一个数组.

Look at the JSON - where you see curly brackets {} expect an object, where you see square brackets [] expect an array.

使用 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
                )

        )

)

它将告诉您在哪里有对象,在哪里有数组以及它们的成员的名称和值.

It'll tell you where you have objects, where you have arrays, along with the names and values of their members.

如果您只能在迷失之前进入其中-走那么远,然后用print_r()击中那个:

If you can only get so far into it before you get lost - go that far and hit that with print_r():

print_r($yummy->toppings[0]);

stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

这个方便的交互式JSON资源管理器中进行查看.

将问题分解为更容易解决的问题.

Break the problem down into pieces that are easier to wrap your head around.

发生这种情况的原因是:

This happens because either:

  1. JSON完全由null组成.
  2. JSON无效-检查 json_last_error_msg的结果或通过类似 JSONLint 的方式输入.
  3. 它包含嵌套超过512个级别的元素.通过将整数作为第三个参数传递给 json_decode() .
  4. ,可以覆盖此默认最大深度.
  1. The JSON consists entirely of just that, null.
  2. The JSON is invalid - check the result of json_last_error_msg or put it through something like JSONLint.
  3. It contains elements nested more than 512 levels deep. This default max depth can be overridden by passing an integer as the third argument to json_decode().

如果您需要更改最大深度,则可能是在解决错误的问题.找出为什么要获取如此深层的嵌套数据(例如,正在查询的生成JSON的服务存在错误),并使该错误不发生.

If you need to change the max depth you're probably solving the wrong problem. Find out why you're getting such deeply nested data (e.g. the service you're querying that's generating the JSON has a bug) and get that to not happen.

有时,您将拥有一个对象属性名称,其中包含连字符-或符号@之类的内容,不能在文字标识符中使用.相反,您可以在花括号内使用字符串文字来解决该问题.

Sometimes you'll have an object property name that contains something like a hyphen - or at sign @ which can't be used in a literal identifier. Instead you can use a string literal within curly braces to address it.

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

如果您有一个整数作为属性,请参见:如何以类似整数的名称访问对象属性?作为参考.

If you have an integer as property see: How to access object properties with names like integers? as reference.

这很荒谬,但它确实发生了-JSON中将JSON编码为字符串.解码,照常访问字符串,解码那个,最终找到所需的内容.

It's ridiculous but it happens - there's JSON encoded as a string within your JSON. Decode, access the string as usual, decode that, and eventually get to what you need.

$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()无法立即处理,那么事情开始变得棘手.参见:


Data doesn't fit in memory

If your JSON is too large for json_decode() to handle at once things start to get tricky. See:

  • Processing large JSON files in PHP
  • How to properly iterate through a big json file

请参阅:参考:在PHP中对数组和数据进行排序的所有基本方法.

See: Reference: all basic ways to sort arrays and data in PHP.

这篇关于如何使用PHP从JSON提取数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆