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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:54:26