我知道其他人已经问过这个,但我没有找到解决问题的方法。在我的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”字段中访问它们然后将它们存储在变量中?我尝试了很多解决方案,但没有一个适合我。
答案 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_code
和resp_description
,您可以执行以下操作:
$respCode = $jsonDecode[0]["resp_code"];
$respDescription = $jsonDecode[0]["resp_description"];