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

Dart:如何将无引号非标准JSON字符串转换为Map

解决非标准无引号JSON转Dart Map的问题

你的问题核心在于输入的字符串不是合法JSON格式——JSON要求所有键名和字符串值必须用双引号包裹,而你传入的"{data: {name: joy, tags: aa,bb, city: jakarta}}"完全缺省了引号,导致json.decode无法解析。下面提供两种可行的解决方法:

方法一:正则表达式手动修正字符串

通过正则匹配键名和字符串值,给它们补上双引号,转成合法JSON后再解码:

import 'dart:convert';

void main() {
  final nonStandardJson = "{data: {name: joy, tags: aa,bb, city: jakarta}}";
  
  // 给所有键名(冒号前的标识符)加双引号
  final withQuotedKeys = nonStandardJson.replaceAll(RegExp(r'(\w+)(?=:)'), r'"$1"');
  
  // 给冒号后、逗号/大括号前的字符串值加双引号
  final validJson = withQuotedKeys.replaceAll(RegExp(r':\s*([^",{}]+)(?=[,}])'), r': "$1"');
  
  // 解码为Dart Map
  final result = json.decode(validJson) as Map<String, dynamic>;
  
  print(validJson); // 输出:{"data": {"name": "joy", "tags": "aa,bb", "city": "jakarta"}}
  print(result); // 输出:{data: {name: joy, tags: aa,bb, city: jakarta}}
}

注意:这个正则适配你的示例场景,如果字符串包含特殊字符(如空格、非字母数字键名),需要调整正则规则。

方法二:用YAML库解析(适配复杂场景)

如果你的非标准JSON格式更复杂(比如嵌套数组、特殊字符值),手动正则容易出错,可以利用YAML语法兼容无引号键值对的特性,用yaml库解析后转成Map:

import 'package:yaml/yaml.dart';
import 'dart:convert';

void main() {
  final nonStandardJson = "{data: {name: joy, tags: aa,bb, city: jakarta}}";
  
  // 将非标准字符串当作YAML解析
  final yamlMap = loadYaml(nonStandardJson) as YamlMap;
  
  // 转换为Dart原生Map
  final result = Map<String, dynamic>.from(yamlMap);
  
  // 可选:转成合法JSON字符串
  final validJson = json.encode(result);
  
  print(validJson); // 输出:{"data":{"name":"joy","tags":"aa,bb","city":"jakarta"}}
  print(result);
}

使用前需要在pubspec.yaml中添加依赖:

dependencies:
  yaml: ^3.1.2

内容的提问来源于stack exchange,提问作者R Rifa Fauzi Komara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:20:29