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

Dart/Flutter中json.decode解析多行JSON值时抛出FormatException异常求助

解决JSON解析时的FormatException(控制字符问题)

这个坑我之前踩过好几次!你碰到的FormatException: Control character in string错误,本质是你的JSON字符串里存在未转义的ASCII控制字符(像换行符、制表符、或者一些看不见的特殊字符,ASCII码在0-31之间的那种),而标准JSON规范是不允许这类字符直接出现在字符串字段里的。

先定位问题根源

虽然你贴的示例description文本看起来正常,但你的真实JSON数据里,大概率是description这个长文本字段(也可能是count/price,不过可能性低)在生成或复制过程中混入了控制字符——比如从Word文档复制时带了隐藏的换行符,或者接口返回的JSON没有正确转义特殊字符。

具体解决方案

1. 清理现有JSON字符串中的控制字符

如果是拿到了别人提供的JSON字符串,先做一次字符清理,过滤掉非法的控制字符。可以写个简单的Dart工具函数:

String sanitizeJsonString(String rawJson) {
  // 保留JSON允许的转义字符(\t、\n、\r、\f、\b),移除其他控制字符
  return rawJson.replaceAll(RegExp(r'[\x00-\x08\x0B\x0C\x0E-\x1F]'), '');
}

然后在解析前先处理:

var str = '{ "description": "...你的原始JSON字符串..." }';
var cleanedJson = sanitizeJsonString(str);
var decodedData = json.decode(cleanedJson);

2. 确保JSON生成时正确转义(如果是你自己生成的JSON)

如果是你自己拼接或生成JSON数据,一定要把控制字符转成JSON允许的转义序列:

  • 换行符\n要写成\\n(在Dart字符串里需要双重转义)
  • 制表符\t要写成\\t
  • 其他特殊字符同理,用对应的转义格式代替原始字符

3. 排查小技巧

可以把你的原始JSON字符串打印到控制台,或者粘贴到VS Code这类支持JSON语法校验的编辑器里——编辑器会自动高亮显示非法的控制字符,帮你快速定位问题位置。

另外提个小细节:你贴的示例代码里的str写法有问题,Dart里JSON字符串需要用引号包裹起来,比如用三重单引号来写多行JSON:

var str = '''{ 
  "count": "1", 
  "price": "5", 
  "description": "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English." 
}''';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:57:46