8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

noam steiner 1月前

20 0

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

本指南旨在提供一般参考问答,涵盖许多永无止境的 “如何访问 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、本帖标题:如何使用 PHP 从 JSON 中提取和访问数据?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由noam steiner在本站《json》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 简介

    首先,你有一个字符串。是一种基于文本的序列化格式 - 因此是一个花哨的字符串,但仍然只是一个字符串。使用 不是数组、对象或数据结构。JSON JSON json_decode() .

     $data = json_decode($json);
    

    您可能会发现:

    这些是可以用 JSON 编码的内容。或者更准确地说,这些是可以用 JSON 编码的内容的 PHP 版本。

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

    对象将是 stdClass ,stdClass 是一个内置类,它只是一个 通用的东西 ,在这里并不重要。


    访问对象属性

    可以像访问其他对象的公共非静态属性一样 properties 属性 $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 值”
    键 '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 处理大型 JSON 文件
    • 如何正确地迭代一个大的 json 文件

    如何排序

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

返回
作者最近主题: