You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter项目使用http包解析JSON时遭遇FormatException: Invalid unicode escape错误的解决咨询

解决Flutter中JSON解码的FormatException(无效Unicode转义)问题

问题根源

你遇到的这个错误,核心原因是服务器返回的JSON字符串里存在不完整的Unicode转义序列。正常的Unicode转义规则是\u后面必须跟4位十六进制字符(比如俄语字母Н对应的正确转义是\u041d),但从错误日志里的\u041能看出来,这里少了一位字符,直接导致json.decode()解析失败。

你提到用JSON验证器检查过响应有效,大概率是因为部分验证器对这种不规范的转义序列容错性较高,没有检测出这个问题——但Flutter的默认JSON解析器是严格遵循标准的,所以会抛出异常。

可行的解决方案

1. 优先修复服务器端编码(最彻底)

这是最优解:让后端同事检查JSON编码逻辑,确保所有Unicode转义都是完整的4位十六进制格式。可能是服务器在生成响应时出现了截断,或者编码处理环节有bug,修复后客户端不需要做任何改动就能正常解析。

2. 客户端临时预处理响应字符串

如果暂时动不了服务器代码,可以在解析前手动修复响应体里的不完整转义:

var response = await http.get(
  '${ApiConstants.BASE_URL}$path$formattedParams',
  headers: {
    'accept': "application/json",
    'Authorization': 'Bearer $token',
  },
);

// 修复不完整的\u转义序列:补全到4位,前面补0
String fixedResponseBody = response.body.replaceAllMapped(
  RegExp(r'\\u([0-9a-fA-F]{1,3})'),
  (match) {
    String incompleteHex = match.group(1)!;
    // 补全为4位十六进制字符串
    while (incompleteHex.length < 4) {
      incompleteHex = '0$incompleteHex';
    }
    return '\\u$incompleteHex';
  },
);

return json.decode(fixedResponseBody);

提示:这个方案是针对当前问题的临时补丁,如果服务器后续还出现其他编码问题,可能需要调整正则或者处理逻辑。

3. 换用容错性更高的JSON解析库

如果默认的json.decode()过于严格,可以尝试第三方解析库,比如fast_json_parser,这类库对一些不规范的JSON格式容错性更强。不过这种方式会增加项目依赖,需要根据实际情况权衡。

验证修复效果

修改后,可以先打印预处理后的响应体片段,确认那些不完整的\u转义已经被补全为4位格式,再调用解析方法,应该就能正常拿到JSON数据了。

内容的提问来源于stack exchange,提问作者Andreas Hunter

火山引擎 最新活动