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

Flutter中如何解码格式无效的字符串化JSON

Flutter 解析无引号非标准JSON字符串实现方案

你拿到的字符串属于不符合RFC规范的非标准JSON:标准JSON要求对象键、字符串类型值必须用双引号包裹,直接调用内置jsonDecode会抛出格式解析异常,需要先对字符串做规则修正,转成合法JSON后再解码。

实现步骤

  • 剥离原始字符串最外层多余的包裹双引号,拿到核心类JSON结构串
  • 通过正则匹配,给所有未加引号的对象键、字符串值补上双引号,兼容数组内带空格的字符串值
  • 对修正后的合法JSON字符串调用标准解码方法,拿到结构化的Dart对象

可直接复用的代码示例

import 'dart:convert';

void parseNonStandardJson() {
  // 原始待解析字符串
  const rawStr = '"[{division: bacteriology, speciality: microbiology, tests: [appearence of urine], category: urine}]"';

  // 1. 移除最外层多余的包裹引号
  String tempStr = rawStr.substring(1, rawStr.length - 1);

  // 2. 正则补全双引号:匹配所有语法符号间的键、字符串值,自动包裹双引号
  tempStr = tempStr.replaceAllMapped(
    RegExp(r'(?<=[:{,\[])\s*([a-zA-Z0-9\s]+?)\s*(?=[,:\]\}])'),
    (match) => '"${match.group(1)!.trim()}"'
  );

  // 3. 标准JSON解码
  final parsedResult = jsonDecode(tempStr);
  
  // 此时parsedResult为List<Map<String, dynamic>>类型,可直接取值操作
  print(parsedResult[0]['division']); // 输出 bacteriology
  print(parsedResult[0]['tests']); // 输出 [appearence of urine]
}

适配注意事项

  • 如果待解析内容包含数字、布尔类型值,需要调整正则匹配规则,避免给非字符串类型值错误包裹引号导致类型解析异常
  • 如果字符串值中包含冒号、逗号、方括号/花括号这类JSON语法符号,上述正则需要额外增加边界判断,避免匹配错位
  • 正则替换完成后建议先打印临时字符串校验格式,确认所有键值都正确包裹双引号后再执行解码,减少格式错误排查成本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:57:22