Dart解析多成员JSON报FormatException如何解决?
报错原因
你当前获取到的响应内容不是标准合法的JSON结构:它是多个独立JSON对象用逗号直接拼接的片段,缺少JSON数组要求的最外层[]包裹。
标准JSON语法仅支持解析单个合法值(单个对象、字符串、数字、布尔值、null),或是用方括号包裹的数组值。当响应只有1个对象时,本身属于合法单个JSON值,所以jsonDecode可以正常运行;当有多个对象用逗号拼接时,解析器读完第一个对象的闭合}后,后续的逗号和下一个对象不属于合法的单值结构,就会抛出你遇到的 FormatException 异常。
修复方法
只需要把原始响应字符串补全为合法的JSON数组格式,再调用解码方法即可,参考实现代码(Dart):
import 'dart:convert'; // 读取原始响应内容 final rawStr = response.body; // 清理首尾空白、末尾可能存在的多余尾逗号,避免特殊格式导致解析失败 final cleanedStr = rawStr.trim().replaceFirst(RegExp(r',\s*$'), ''); // 给处理后的字符串外层包裹方括号,拼接为符合规范的JSON数组 final validJsonArray = '[$cleanedStr]'; // 正常解码即可,返回结果为对应对象的数组列表 List<dynamic> parseResult = jsonDecode(validJsonArray); // 若需要强类型支持,可将数组内的每个Map元素转换为自定义业务模型 // 示例:List<User> userList = parseResult.map((item) => User.fromJson(item)).toList();
注意事项
- 如果后端接口支持调整,优先推动接口返回标准JSON数组格式(自带最外层
[]),不需要前端额外做字符串修正,兼容性更好 - 如果接口无法修改,上述字符串处理方案可以覆盖绝大多数多对象拼接的响应解析场景,尾逗号清理步骤不要省略,避免最后一个对象后多余的逗号触发新的格式异常
内容的提问来源于stack exchange,提问作者Ariel Soriano Vassia
相关产品推荐
相关产品推荐

