PHP解码嵌套JSON读取属性报错的解决方法
错误原因
报错的核心原因是待解析的原始JSON中,return字段的值不是结构化的对象/数组,而是一段JSON格式的字符串。仅对外层JSON做一次解码后,$obj['return']的类型是字符串,自然无法通过->语法读取其中的MESSAGE属性,触发读取字符串属性的报错。
你贴出的原始JSON示例存在内层双引号未转义的格式问题,实际接口返回的合法JSON中,return字段里的内层双引号会自动带转义符,不需要手动处理。
正确实现方式
两次解码即可拿到所有需要的内容:第一次解码外层JSON结构,第二次对return字段存储的JSON字符串做解码,之后就能直接读取所有目标字段。
// 替换为你实际拿到的原始JSON内容 $rawResponse = '{"return":"{\"MESSAGE\":\"INVOICE IS ACCEPPTED - ECHO THE PAYMENT URL\",\"CODE\":\"0\",\"SUCCESS\":true,\"RESULT\":[{\"DESCRIPTION\":\"Payment for business registration\",\"PAYMENTTOKEN\":\"6354c166-cdb1-459a-8a7c-e23f9d3a0dd6\",\"APIPAYREDIRECTURL\":\"https://testcalpay.caleservice.net/pay/secure/index.php?paytoken=6354c166-cdb1-459a-8a7c-e23f9d3a0dd6\",\"QRLCODEURL\":\"https://testcalpay.caleservice.net/paymentqrs/BK3NUFI936.png\",\"PAYMENTCODE\":\"BK3NUFI936\",\"MOMOSTATUS\":\"1\",\"ORDERCODE\":\"INV2022003\",\"MOMOPAYMENT\":\"FAILED\",\"SHORTPAYCODE\":\"10000645\"}]}"}; // 解码外层JSON,第二个参数传true统一转成关联数组,避免对象数组语法混用出错 $outer = json_decode($rawResponse, true); // 校验外层JSON格式合法性 if (json_last_error() !== JSON_ERROR_NONE) { exit("外层JSON解析失败:" . json_last_error_msg()); } // 解码return字段内嵌套的JSON字符串 $returnData = json_decode($outer['return'], true); if (json_last_error() !== JSON_ERROR_NONE) { exit("return字段内容解析失败:" . json_last_error_msg()); } // 读取return下的单值属性 $msg = $returnData['MESSAGE']; $code = $returnData['CODE']; $isSuccess = $returnData['SUCCESS']; // 读取RESULT数组内容 $resultArr = $returnData['RESULT']; // 验证输出 var_dump($msg, $code, $isSuccess, $resultArr);
注意事项
- 遇到接口返回多层数据的场景,先通过
var_dump()打印解码后变量的实际类型,确认字段是结构化数据还是序列化后的字符串,再决定是否需要二次解码 - 每次调用
json_decode()后建议增加JSON错误校验,可快速定位是格式问题还是取数逻辑问题 - 统一使用关联数组(
json_decode第二个参数传true)取数,可避免数组、对象操作语法混用导致的报错
内容的提问来源于stack exchange,提问作者N. Felix
相关产品推荐
相关产品推荐

