在php中读取嵌套的json

时间:2016-02-05 10:43:38

标签: php json

我知道其他人已经问过这个,但我没有找到解决问题的方法。在我的PHP页面中,我调用外部服务,但我无法修改获得的响应。

我正在使用JSON和PHP移动我的第一步。 响应是这样的JSON,我使用var_dump方法打印它:

object(stdClass)#1 (3)
{
    ["search_string"]=>string(15) "ABCDEFG HI LMNO"
    ["resut"]=>string(5) "apixi"
    ["0"]=>array(1){
       [0]=>object(stdClass)#2(2){
          ["resp_code"]=>string(7) "12.34.0"
          ["resp_description"]=>string(15) "ABCDEFG HI LMNO"
       }
    }
}

在我的PHP页面中,我可以使用此代码读取“search_string”键的值“ABCDEFG HI LMNO”,在$output变量中我存储cUrl调用的结果

.......
$output = curl_exec($ch);
$jsonDecode =json_decode(str_replace('""','"',$output));
var_dump($jsonDecode);
echo $jsonDecode -> search_string;

我需要str_replace方法,因为JSON很脏但并非总是如此,我如何在“resp_code”和“resp_description”字段中访问它们然后将它们存储在变量中?我尝试了很多解决方案,但没有一个适合我。

2 个答案:

答案 0 :(得分:0)

在已解码的JSON中, resp_code resp_description 键难以获取,因为顶级对象具有数字(“0”)属性。试图达到这个属性:

public IQueryable<T> GetInfo(long limit, Expression<Func<MyType, T>> selector)
{
    var result = from t in DbSet
                 where t.id < limit
                 select selector(t) // doesn't work
    return result
}

将给出此解析错误:

  

语法错误,意外的'0'(T_LNUMBER),期待标识符(T_STRING)或变量(T_VARIABLE)或'{'或'$'

使用字符串表示法($jsonDecode -> 0 )尝试相同的操作也会失败。

但是,错误消息中的建议很有用:使用大括号封装零。然后,您可以通过添加数组索引选择器(-> "0")轻松地继续访问对象和你感兴趣的钥匙,如下:

[0]

如果你期望该数组echo $jsonDecode->{0}[0]->resp_code; echo $jsonDecode->{0}[0]->resp_description; 中有更多元素,那么就像这样循环遍历它们:

$jsonDecode->{0}

替代

但是,如果您更喜欢使用关联数组而不是对象,则可以使用文档中所述的json_encode的第二个参数:

  

assoc

     

TRUE 时,返回的对象将转换为关联数组。

那么你将传递 true 作为第二个参数:

foreach ($jsonDecode->{0} as $element) {
    echo $element->resp_code;
    echo $element->resp_description;
}

然后,上面的代码将被重写为以关联数组的形式访问变量:

$jsonDecode = json_decode(str_replace('""', '"', $output), true);

答案 1 :(得分:0)

您可以通过向stdClass函数添加第二个参数将其转换为常规PHP数组,而不是将JSON数组转换为json_decode对象:

$jsonDecode =json_decode(str_replace('""','"',$output), true);

在输出中的情况下,您将获得一个多维数组。

然后,要访问resp_coderesp_description,您可以执行以下操作:

$respCode = $jsonDecode[0]["resp_code"];
$respDescription = $jsonDecode[0]["resp_description"];