获取成员详情的isLeaderInDepts是JSON字符串,但是key的部分没有使用引号,这会导致PHP下直接使用json_decode返回null值。
例如 isLeaderInDepts:"{52342:true}", 这个字符串直接用json_decode会返回null值,必须先处理成"{'52342':true}"才能正确的解析。
其它类似返回此类格式json字符串的接口应该会有同样的问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
针对您遇到的问题,JSON 标准要求键名必须用双引号包围。您提供的 JSON 字符串 isLeaderInDepts:"{52342:true}"
不符合这一规范,因为键 52342
没有使用双引号,这导致 PHP 的 json_decode
函数无法正确解析它。
手动修正 JSON 字符串: 在将此字符串传递给 json_decode
之前,您需要先手动或通过编程方式将其修正为标准的 JSON 格式,即添加缺失的双引号:
$invalidJson = 'isLeaderInDepts:"{52342:true}"';
// 替换错误格式为正确格式
$correctJson = str_replace(':', ':"', $invalidJson);
$correctJson = preg_replace('/(\d+):/', '"$1":', $correctJson);
$decodedData = json_decode($correctJson, true);
这段代码首先通过替换操作为键添加了前导的双引号,并使用正则表达式确保所有数字键也被双引号包围。
自定义解析函数: 如果此类问题频繁出现且来自特定接口,您可以编写一个自定义函数来自动修正这些不规范的 JSON 字符串,然后再进行解码。
与接口提供方沟通: 考虑到这是数据源的问题,最根本的解决办法是与接口的提供方沟通,请求他们按照 JSON 规范输出数据,确保所有的键名都使用双引号包围,例如应返回 "isLeaderInDepts":{"52342":true}
而非当前格式。这样可以避免客户端需要额外处理的复杂性。
json_decode
时,始终检查其返回值是否为 null
以及通过 json_last_error()
检查是否有解析错误,以便于调试和错误处理。通过上述方法,您可以有效解决因键名缺少引号导致的 JSON 解析失败问题。