当前位置: 首页 > 知识库问答 >
问题:

如何使用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中解码并访问结果数据?

共有3个答案

钮长恨
2023-03-14
// Using json as php array 

$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';

//or use from file
//$json = file_get_contents('results.json');

$someArray = json_decode($json, true);

foreach ($someArray as $key => $value) {
    echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
晋越彬
2023-03-14

可以使用json_decode()将json字符串转换为PHP对象/数组。

如。

输入:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

输出:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

需要记住的几点:

  • json\u decode要求字符串为有效的json,否则它将返回NULL
弘柏
2023-03-14

首先你有一根绳子。JSON不是数组、对象或数据结构。JSON是一种基于文本的序列化格式——所以是一个花哨的字符串,但仍然只是一个字符串。在PHP中使用json_decode()解码。

 $data = json_decode($json);

你可能会发现:

  • 标量:字符串、int、浮点数和bools
  • nulls(它自己的一种特殊类型)
  • 复合类型:对象和数组。

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

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

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

访问其中一个对象的属性的方式与访问任何其他对象的公共非静态属性的方式相同,例如$object-

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


枫叶点缀巧克力

或者随意使用任何一个数不清的内置数组函数。

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

$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

执行此操作时,您将获得关联数组,而不是对象-带有键字符串的数组。同样,您可以像往常一样访问其中的元素,例如$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=

$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浏览器中看看它。

把问题分解成更容易理解的部分。

发生这种情况是因为:

  1. JSON完全由以下内容组成:null
  2. JSON无效-请检查JSON\u last\u error\u msg的结果,或者通过类似JSONLint的方式进行检查
  3. 它包含嵌套深度超过512层的元素。通过将整数作为第三个参数传递给json\u decode(),可以覆盖此默认最大深度

如果需要更改最大深度,则可能是解决了错误的问题。找出为什么您会得到如此深的嵌套数据(例如,您正在查询的生成JSON的服务有一个bug),并避免这种情况发生。

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

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

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

如果您有一个整数作为属性,请参阅:如何访问具有整数等名称的对象属性?作为参考。

这很荒谬,但它发生了——在你的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\u decode()无法立即处理,那么事情就会变得棘手。见:

  • 在PHP中处理大型JSON文件
  • 如何正确地迭代一个大的json文件

请参阅:参考:PHP中排序数组和数据的所有基本方法。

 类似资料:
  • 问题内容: 这旨在作为一般参考问题和答案,涵盖许多永无止境的 “如何访问JSON中的数据?” 问题。它是在这里处理在PHP中解码JSON和访问结果的广泛基础知识。 我有JSON: 如何在PHP中对此进行解码并访问结果数据? 问题答案: 介绍 首先,您有一个字符串。JSON不是数组,对象或数据结构。JSON是基于文本的序列化格式,因此是花哨的字符串,但仍然只是字符串。使用解码PHP。 在其中您可能会

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

  • 问题内容: 我返回数组数据类型从到,我曾经将其转换为一个关联数组,但是当我尝试使用关联使用它,我得到的错误返回的数据看起来像这样 请,我如何访问这样的数组?感谢您的任何建议。 问题答案: 在上面的示例中,将您作为第二个参数传递给您时,您可以执行类似以下操作来检索数据: 如果您不将其作为第二个参数传递,则将其作为对象返回:

  • 问题内容: 在此URL中,我有一些Json数据。如何 使用该URL将数据获取到我的andorid应用程序。 我在Google中看到过引用。但是没有解决办法。 我是Andorid的新手。 请帮我。 问题答案: 做这个 : 步骤-1在您的gradle中导入排球库: 实现’com.android.volley:volley:1.1.0’ 然后在Java中编写以下代码:

  • 示例:第一个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

  • 这里我有两个文档,我需要查询以获得和我只想获得符合以上条件的注释。并非所有评论。 ' { “_id”: ObjectId(“53b7f2383ed7755c2400002e”), “title”: “Post One”, “author”: “bob”, “posted”: ISODate(“2014-07-05T12:40:24.0Z”), “pageViews”: NumberInt(5),