Dart如何定义解析含$、{}、单双引号等特殊字符的Map变量
Dart 含特殊字符Map的正确定义/解析方案
编译失败核心原因
Dart语法规则中,普通单/双引号包裹的非原始字符串里,$是字符串插值的起始标识,编译器会自动识别$后的内容为待插入的变量/表达式。你给出的Map值里包含多组未转义的$,编译器找不到对应插值变量就会直接报编译错误。另外你尝试的s3用b''前缀是Dart中字节数组(List<int>)的声明语法,本身就不是字符串类型,必然编译失败。
实现方案
根据你的使用场景二选一即可:
方案1:直接声明Map字面量
不需要经过JSON解析流程,两种写法都可以:
- 转义特殊字符:在所有
$前加反斜杠\做转义,编译器就会将$识别为普通字符
// 建议显式声明泛型约束,类型更安全 Map<String, String> targetMap = { "a": "2022-01-26T17:10:51", "b": "{\$WWWWWW}", "c": "\$\$\$.id=='TEXT'" };
- 用原始字符串:给每个字符串值加
r前缀,原始字符串会完全关闭插值、转义解析逻辑,所有字符按字面量处理,不需要手动转义$、大括号等特殊符号
Map<String, String> targetMap = { "a": r"2022-01-26T17:10:51", "b": r"{$WWWWWW}", "c": r"$$$.id=='TEXT'" };
方案2:先定义JSON字符串,再解析为Map
如果需要先存储JSON格式字符串再转Map,直接用原始字符串包裹完整JSON内容即可,不需要转义任何内部特殊字符,配合dart:convert的jsonDecode方法就能完成解析:
import 'dart:convert'; // 原始字符串包裹完整JSON,你之前写的s1本身语法是合法的 String jsonContent = r'{"a": "2022-01-26T17:10:51", "b": "{$WWWWWW}", "c":"$$$.id=='TEXT'"}'; // 解析为Map类型 Map parsedMap = jsonDecode(jsonContent);
小提示:如果JSON内容里同时包含单引号、双引号,可以用三引号原始字符串
r'''内容'''包裹,完全不需要处理内部引号的转义问题。
原有写法错误汇总
- 直接声明Map、定义
s2普通字符串时,未对$做转义,触发插值语法校验失败 s3误用字节数组的b前缀声明字符串,类型完全不匹配
内容的提问来源于stack exchange,提问作者sosnus
相关产品推荐
相关产品推荐

