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

