【问题标题】:How to parse this multi dimensional JSON with PHP to fetch correct array?如何用 PHP 解析这个多维 JSON 以获取正确的数组?
【发布时间】:2023-03-15 18:39:01
【问题描述】:

我有 JSON,它的格式类似于下面的示例,这是循环整个文件以捕获“IWANTTHIS”值的正确方法? JSON 中的所有数组都处于同一级别(“some:products”)。今天下午的 JSON 对我来说太复杂了……

{
  "type": "page",
  "pageType": "section",
  "_links": {},
  "_embedded": {
  "somkindof:blocks": [
    {
     "somevalue": 25,
     "_embedded": {
     "some:products": [
     {
      "system": {
      "availability": {},
      "IWANTTHIS": "20284",
      "hhhh": []
      },
....

我尝试了类似的方法,但我无法捕获像我的示例中那样格式化的值。

$jfo = json_decode($vcurl);
$channel = $jfo->_embedded->[somkindof:blocks];

var_dump $channel;

【问题讨论】:

  • 尝试$channel = $jfo->_embedded->{'somkindof:blocks'}(您可能会发现将其用作数组更容易,请查看 PHP 文档中的 json_decode 参数 2)

标签: php arrays json parsing formatting


【解决方案1】:

如果您将 JSON 解码为关联数组,事情会变得更容易。

(甚至对象也会变成关联数组,你可以用相同的语法解析整个对象树)。

然后你用方括号语法解析数组。

请注意,"somkindof:blocks""some:products" 都是常规数组(项目的有序列表),因此您必须解析其中的每个项目(使用简单的 foreach

说你可能有很多“我要这个”。

<?php

$jfo = json_decode($vcurl, true ); // <-- decode into associative array

foreach( $jfo[ "embedded" ][ "somkindof:blocks" ] as $level_1_item )
{
    foreach( $level_1_item[ "_embedded" ][ "some:products" ] as $level_2_item )
    {
        $iWantThis = $level_2_item[ "IWANTTHIS" ];
    }
}

【讨论】:

    【解决方案2】:

    感谢这个工具:http://jsonselector.com

    $channel = ['_embedded']['somkindof:blocks'][0]['_embedded']['some:products'][0]['system']['IWANTTHIS']
    

    【讨论】:

      【解决方案3】:

      true 作为第二个参数添加到 json_decode 以将其解码为数组而不是对象。

      <?php
      $json = '{
        "type": "page",
        "pageType": "section",
        "_links": {},
        "_embedded": {
          "somkindof:blocks": [
            {
              "somevalue": 25,
              "_embedded": {
                "some:products": [
                  {
                    "system": {
                      "availability": {},
                      "IWANTTHIS": "20284",
                      "hhhh": []
                    }
                  }
                ]
              }
            }
          ]
        }
      }';
      
      $jfo = json_decode($json, true);
      
      $channel = $jfo['_embedded']['somkindof:blocks'];
      print_r($channel);
      

      【讨论】:

        【解决方案4】:

        所有 cmets 都通过提供 truejson_decode() 函数来建议 Array 选项。

        但是,如果您希望维护 stdClass,请使用大括号。

        例如:

        $jfo = json_decode($json);
        
        foreach($jfo->_embedded->{'somkindof:blocks'} as $block) {
            echo $block->{'somSomething is wrongue'};
        }
        

        【讨论】:

          猜你喜欢
          • 2013-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-08
          • 1970-01-01
          • 2016-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多