【问题标题】:Parse JSON Data with PHP使用 PHP 解析 JSON 数据
【发布时间】:2013-11-15 17:57:31
【问题描述】:

我已经多次解析 JSON 数据,但由于某种原因无法找到嵌套数据时使用的正确语法。我正在尝试解析此 JSON 中的“资产”,但无论我尝试什么,都会继续获取为 foreach() 提供的无效参数。

   "3435":{
      "name":"COLO-1014-SJ1",
      "nickname":"US-SJC-004",
      "type":"Colocated Server",
      "location":"San Jose:55 S Market",
      "assets":{
         "CPU":[
            {
               "model":"Intel E3 1270"
            }
         ],
         "Hard Drives":[
            {
               "model":"Western Digital 500GB RE4 ABYX SATA"
            },
            {
               "model":"Western Digital 500GB RE4 ABYX SATA"
            },
            {
               "model":"Kingston 240GB SSD"
            }
         ],
         "RAM":[
            {
               "model":"Super Talent 4GB DDR3 1333 ECC"
            },
            {
               "model":"Super Talent 4GB DDR3 1333 ECC"
            },
            {
               "model":"Super Talent 4GB DDR3 1333 ECC"
            },
            {
               "model":"Super Talent 4GB DDR3 1333 ECC"
            }
         ],

我希望它类似于...

$json = json_decode($jsondata, true);

foreach ($json as $item)
{
    foreach ($item['assets']->RAM as $asset)
    {
        echo $asset->model;
    }

【问题讨论】:

  • 第二个 json_decode arg 用于 assoc 数组,但您在循环中使用了数组和对象之间的混合。使用 true 作为 2nd arg 请使用 $item['assets']['RAM'] 或使用像下面许多回答 false 作为 2nd arg 的对象
  • 就是这样,非常感谢。我尝试了以下所有解决方案,但在我注意到这一点之前都没有奏效。如果您想回复,我会接受回复

标签: php foreach json


【解决方案1】:

您似乎忘记在 JSON 数据周围添加花括号。如果您的 JSON 数据无效,则 json_decode() 函数将无法正常工作。

我已在下面修复了您的 JSON 代码,现在可以验证并符合 JSON 标准。

{
    "3435": {
        "name": "COLO-1014-SJ1",
        "nickname": "US-SJC-004",
        "type": "Colocated Server",
        "location": "San Jose:55 S Market",
        "assets": {
            "CPU": [
                {
                    "model": "Intel E3 1270"
                }
            ],
            "Hard Drives": [
                {
                    "model": "Western Digital 500GB RE4 ABYX SATA"
                },
                {
                    "model": "Western Digital 500GB RE4 ABYX SATA"
                },
                {
                    "model": "Kingston 240GB SSD"
                }
            ],
            "RAM": [
                {
                    "model": "Super Talent 4GB DDR3 1333 ECC"
                },
                {
                    "model": "Super Talent 4GB DDR3 1333 ECC"
                },
                {
                    "model": "Super Talent 4GB DDR3 1333 ECC"
                },
                {
                    "model": "Super Talent 4GB DDR3 1333 ECC"
                }
            ]
        }
    }
}

如果您需要检查 JSON 代码,可以使用验证器,例如 http://jsonlint.com/

其次,你的PHP代码也是错误的:

$json = json_decode($jsondata, true);

foreach ($json as $item)
{
    foreach ($item->assets->RAM as $asset)
    {
        echo $asset->model;
    }
}

您一直试图以数组形式访问返回的对象,这也会导致 foreach 循环出现问题。

【讨论】:

  • 我的 JSON 在那个链接上是有效的,但那是我的错,因为我只发布了一个小的 sn-p。我完全粘贴了您的 PHP 代码,它继续向每个循环发送为 foreach() 提供的无效参数。
  • 实际上并不是我的 JSON 中的所有元素都有一个“资产”数组。我认为这可能是问题所在。有没有办法在对它进行 foreach 循环之前检查它是否存在?
  • @BrettPowell 你可以试试 if(!empty($item->assets)){ // 添加代码 }
【解决方案2】:

$item->assets,而不是$item['assets']。执行print_r($json),这样您就可以看到 JSON 各个部分的类型 - 这将使他们更容易弄清楚如何访问它们。

【讨论】:

    【解决方案3】:

    来自php官方文档:http://php.net/manual/fr/function.json-decode.php

    第二个函数参数用于关联数组返回。如果您更喜欢在对象上操作 assoc 数组,则可以使用它。

    但实际上你在循环中混合了数组和对象。

    如果您将arg保留在TRUE,请使用$item['assets']['RAM']

    【讨论】:

      【解决方案4】:

      它被解析为一个对象,所以:

      foreach ($item -> assets -> RAM as $asset){ ... }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多