如何在Flutter中使用系统默认方法解析复杂转义JSON数据
问题原因
你遇到的解码失败有两层原因:
- Dart字符串转义规则问题:你写的
'{"a":"{\"b\":7}"}'中,\"在Dart普通单引号字符串里只会被解析为普通双引号,最终传入json.decode的实际字符串是{"a":"{"b":7}"},属于非法JSON格式,不符合JSON的转义规则。 - 嵌套JSON结构问题:你提供的JSON中
a字段的值本身是被序列化后的JSON字符串,外层解码完成后还需要对内层字符串做二次解码才能拿到最终的b字段值。
解决方案
方案1:修正字符串转义符
手动给需要保留给JSON的反斜杠加一层转义:
import 'dart:convert'; void main() { // 用\\表示需要保留在JSON中的\转义符 String a = '{"a":"{\\"b\\":7}"}'; // 第一次解码外层JSON final outerMap = json.decode(a); print("外层解析结果:$outerMap"); // 第二次解码a字段对应的内层JSON字符串 final innerMap = json.decode(outerMap['a']); print("内层b字段的值:${innerMap['b']}"); }
方案2:使用Dart原始字符串(更便捷)
给字符串加r前缀声明为原始字符串,不需要额外转义反斜杠:
import 'dart:convert'; void main() { // 原始字符串会保留所有字面量字符,无需手动转义 String a = r'{"a":"{\"b\":7}"}'; final outerMap = json.decode(a); final innerMap = json.decode(outerMap['a']); print("b的值为:${innerMap['b']}"); }
两种方案运行后都可以正常拿到内层的b字段值7。
内容的提问来源于stack exchange,提问作者Shubham Baranwal
相关产品推荐
相关产品推荐

