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
相关产品推荐
相关产品推荐

