You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:06:30