你好,我有一个非常凌乱的JSON,我想从中读取数据,但我想不出一种方法。
看起来像这样
{
"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;
}
这似乎对我不起作用
答案 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”的键,其值为空,然后抛出异常以破坏递归函数,因为我们找到了它,因此无需继续在阵列上运行。