开发者社区 问答 正文

服务端返回数据的JSON字符串格式在PHP下解析有问题


获取成员详情的isLeaderInDepts是JSON字符串,但是key的部分没有使用引号,这会导致PHP下直接使用json_decode返回null值。


例如 isLeaderInDepts:"{52342:true}", 这个字符串直接用json_decode会返回null值,必须先处理成"{'52342':true}"才能正确的解析。


其它类似返回此类格式json字符串的接口应该会有同样的问题。

展开
收起
浮云若海 2017-02-15 18:03:08 2216 分享 版权
阿里云 AI 助理回答

针对您遇到的问题,JSON 标准要求键名必须用双引号包围。您提供的 JSON 字符串 isLeaderInDepts:"{52342:true}" 不符合这一规范,因为键 52342 没有使用双引号,这导致 PHP 的 json_decode 函数无法正确解析它。

解决方案

  1. 手动修正 JSON 字符串: 在将此字符串传递给 json_decode 之前,您需要先手动或通过编程方式将其修正为标准的 JSON 格式,即添加缺失的双引号:

    $invalidJson = 'isLeaderInDepts:"{52342:true}"';
    // 替换错误格式为正确格式
    $correctJson = str_replace(':', ':"', $invalidJson);
    $correctJson = preg_replace('/(\d+):/', '"$1":', $correctJson);
    $decodedData = json_decode($correctJson, true);
    

    这段代码首先通过替换操作为键添加了前导的双引号,并使用正则表达式确保所有数字键也被双引号包围。

  2. 自定义解析函数: 如果此类问题频繁出现且来自特定接口,您可以编写一个自定义函数来自动修正这些不规范的 JSON 字符串,然后再进行解码。

  3. 与接口提供方沟通: 考虑到这是数据源的问题,最根本的解决办法是与接口的提供方沟通,请求他们按照 JSON 规范输出数据,确保所有的键名都使用双引号包围,例如应返回 "isLeaderInDepts":{"52342":true} 而非当前格式。这样可以避免客户端需要额外处理的复杂性。

注意事项

  • 数据验证:在实际应用中,对接收到的任何外部 JSON 数据进行验证是一个好习惯,以确保数据的完整性和一致性。
  • 错误处理:当使用 json_decode 时,始终检查其返回值是否为 null 以及通过 json_last_error() 检查是否有解析错误,以便于调试和错误处理。

通过上述方法,您可以有效解决因键名缺少引号导致的 JSON 解析失败问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答