Dart中如何转义美元符号?代码生成场景的实现问题
解决Dart代码生成中保留$转义的问题
问题核心是字符串转义处理逻辑错误:
- 你定义的
{"bar": "\$100"}里,Dart的\$是用来表示字面量$的转义,所以这个字符串的实际值是"$100",根本不包含反斜杠,jsonEncode自然也不会生成反斜杠。 - 要生成包含
\$100的代码,得确保原字符串里有字面量的反斜杠+$,并且输出时正确保留转义。
方案1:直接调整原字符串定义
如果Map是你自己定义的,用以下两种方式之一让字符串包含反斜杠:
// 方式1:使用raw字符串(r前缀),里面的\会被当作字面量处理 final bar = {"bar": r"\$100"}; // 方式2:用双重转义,Dart里两个\表示一个字面量\ // final bar = {"bar": "\\$100"}; final barStr = jsonEncode(bar); print(""" final foo = $barStr; """);
运行后输出:
final foo = {"bar":"\$100"};
方案2:处理外部传入的Map
如果Map是外部获取的,字符串本身只有$100,需要给$手动加上反斜杠,可以递归遍历结构处理:
// 假设外部传入的Map是这样的 final bar = {"bar": "$100"}; // 递归处理所有字符串,给$前添加\ dynamic escapeDollar(dynamic value) { if (value is String) { return value.replaceAll(r'$', r'\$'); } else if (value is Map) { return value.map((k, v) => MapEntry(k, escapeDollar(v))); } else if (value is List) { return value.map(escapeDollar).toList(); } return value; } final escapedBar = escapeDollar(bar); final barStr = jsonEncode(escapedBar); print(""" final foo = $barStr; """);
这样处理后也能得到带\$100的代码输出。
补充说明
jsonEncode会把字符串里的\转义成\\,但当你通过多行字符串插值输出时,Dart会自动将\\解析为单个\,最终生成的代码里就会保留你需要的\$格式。
内容的提问来源于stack exchange,提问作者TSR
相关产品推荐
相关产品推荐

