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

Dart解析含嵌套JSON字符串的JSON时遇FormatException错误求助

Dart解析JSON触发FormatException:Unexpected character问题解决

你的JSON解析失败是因为Dart字符串的转义处理导致最终的JSON格式非法。具体来说,你在普通三重单引号字符串里写的\"会被Dart解析为字面量",使得draft字段的字符串内容中的双引号没有被正确转义,破坏了JSON结构。

解决方案

有两种方法可以修复这个问题:

  • 方法一:使用Dart原始字符串(Raw String)
    在三重单引号前添加r,让Dart不处理字符串内的转义字符,这样\"会被完整保留到最终的JSON中,符合JSON的转义规则。

  • 方法二:双重转义反斜杠
    在普通三重单引号字符串里,用\\"代替\",第一个反斜杠用于Dart字符串的转义,第二个反斜杠作为JSON的转义字符,确保最终JSON中的双引号被正确转义。

修正后的代码示例

方法一:原始字符串实现

import 'dart:convert';

void main() {
  // 使用原始字符串(r''' ... ''')保留转义字符
  String jsonString = r'''
    {
      "status": "success",
      "data":{
        "edit": 1,
        "draft": "{\"id\":\"25863\",\"type\":\"ABC\"}"
      }
    }
  ''';

  try {
    Map<String, dynamic> decode = jsonDecode(jsonString) as Map<String, dynamic>;
    print(decode);
    // 若需解析draft字段内的JSON字符串
    Map<String, dynamic> draftData = jsonDecode(decode['data']['draft']) as Map<String, dynamic>;
    print('Draft详情: $draftData');
  } on FormatException catch (e) {
    print('error ${e.toString()}');
  }
}

方法二:双重转义实现

import 'dart:convert';

void main() {
  // 用双重反斜杠实现JSON转义
  String jsonString = '''
    {
      "status": "success",
      "data":{
        "edit": 1,
        "draft": "{\\\"id\\\":\\\"25863\\\",\\\"type\\\":\\\"ABC\\\"}"
      }
    }
  ''';

  try {
    Map<String, dynamic> decode = jsonDecode(jsonString) as Map<String, dynamic>;
    print(decode);
    // 解析draft内的JSON字符串
    Map<String, dynamic> draftData = jsonDecode(decode['data']['draft']) as Map<String, dynamic>;
    print('Draft详情: $draftData');
  } on FormatException catch (e) {
    print('error ${e.toString()}');
  }
}

修复后,jsonDecode可以正常解析得到Map<String, dynamic>类型的数据。如果需要进一步解析draft字段内的嵌套JSON字符串,只需对decode['data']['draft']再次调用jsonDecode即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:55:01