使用PHP读取混乱的JSON

时间:2018-06-22 09:06:16

标签: php json

你好,我有一个非常凌乱的JSON,我想从中读取数据,但我想不出一种方法。

看起来像这样

https://pastebin.com/55pWWgnK

  {
    "capacity_test": {
      "date": "2017-03-01",
      "status": "done",
      "PROPERTIES": {
        "fail": {
          "capacity_test": {
                    .
                    .
                    .
          },
          "def": [
            {
              "drop_test": {
                "Properties": {
                  "date": "2017-03-05",
                  "status": "done"
                }
              },
              "waves_test": {
                "date": "2018-03-06",
                "status": "done"
              }
            },
            {
              "drop_test": {
                "Properties": null
              },
              "waves_test": {
                "date": "2018-03-06",
                "status": "done"
              }
            },
            {
              "drop_test": {
                "Properties": null
              },
              "waves_test": {
                "date": "2018-03-06",
                "status": "done"
              }
            }
          ]
        },
        "final_test": {
          "Properties": null
        }
      }
    }
  }

PROPERTIES与Properties不相同,并且此json数组是递归的,它内部可以有无限量的“ capacity_test”。

我的问题是,我想检查是否有“状态”键,而该键在任何地方都没有值。 这个JSON很乱,我试图提出一个递归的php函数,例如:

$this->myFunction($json, 'capacity_test');
public function myFunction($json, $step, $status = 0)
{
    if ( is_object($json->$step) ) {
        if ( isset($json->$step->status) ) {
            if ( !empty($json->$step->status) ) {
                $status = 1;
            }
        } else {
            foreach ( $json->$step as $item ) {
                if ( is_object($item) ) {
                    $status = $this->myFunction($item, $step, $status);
                    if ( $status === 0 ) {
                        exit(0);
                    }
                }
            }
        }
    }

    return $status;
}

这似乎对我不起作用

2 个答案:

答案 0 :(得分:0)

这段代码应该可以为您提供帮助。当状态为空时,实施自己的逻辑。

<?php

$jsonString = '{
        "capacity_test": {
          "date": "2017-03-01",
          "status": "done",
          "PROPERTIES": {
            "fail": {
              "capacity_test": {
                "date": "2017-03-02",
                "status": "done",
                "PROPERTIES": {
                  "boolean": false
                }
              },
              "def": [
                {
                  "drop_test": {
                    "Properties": {
                      "date": "2017-03-05",
                      "status": "done"
                    }
                  },
                  "waves_test": {
                    "date": "2018-03-06",
                    "status": "done"
                  }
                },
                {
                  "drop_test": {
                    "Properties": null
                  },
                  "waves_test": {
                    "date": "2018-03-06",
                    "status": "done"
                  }
                },
                {
                  "drop_test": {
                    "Properties": null
                  },
                  "waves_test": {
                    "date": "2018-03-06",
                    "status": ""
                  }
                }
              ]
            },
            "final_test": {
              "Properties": null
            }
          }
        }
      }';

$ar = json_decode($jsonString);

function recArr($array) {
    foreach ($array as $k => $v) {
        if (is_array($v) || is_object($v)) {
            recArr($v);
        } else {
            if ($k == 'status' && $v == '') {
                // some empty logic
                echo $k;
            }
        }
    }
}

var_dump(recArr($ar));

答案 1 :(得分:0)

您可以使用array_walk_recursive,如下所示:

$array = json_decode($str, true); // Convert JSON string to array
$hasEmptyStatus = false;

try {
    array_walk_recursive($array, function($item, $key) {
        if ($key == "status" && $item == "") {
            throw new Exception;
        }
    });
} catch(Exception $e) {
    $hasEmptyStatus = true;
}

var_dump($hasEmptyStatus);

此代码将您的JSON对象转换为数组,然后在您的数组上进行递归运行,直到找到一个名为“ status”的键,其值为空,然后抛出异常以破坏递归函数,因为我们找到了它,因此无需继续在阵列上运行。

https://3v4l.org/LTa56