提问人:Jayden Chiu 提问时间:10/26/2023 最后编辑:Jayden Chiu 更新时间:10/26/2023 访问量:22
Gson 在 HashMap 序列化中转义双引号,即使使用 disableHtmlEscaping
Gson escaping double quotes in HashMap serialization even with disableHtmlEscaping
问:
我想使用 Gson 将 a 转换为 JSON 字符串,其中地图的值之一带有双引号。我不希望这些双引号被转义,但是当转换为带有 in my 的 JSON 字符串时,它仍然会转义双引号HashMap
disableHtmlEscaping
GsonBuilder
我有一个带有以下 String 键和 String 值的 HashMap
{
"test1":"[{"key1":"value1","key2":"value2"}]"
}
当我尝试在使用此代码禁用 HTML 转义后使用 gson 序列化此映射时:
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
return gson.toJson(map);
它返回以下字符串:
{"test1":"[{\"key1\":\"value1\",\"key2\":\"value2\"}]"}
还尝试过:
- 在序列化之前手动转义字符串
- setPrettyPrinting
- 将映射转换为 JsonTree,并使用 getAsString 和 toString 将其作为 String 获取
这些都没有奏效。有人可以帮我弄清楚我做错了什么,以及如何在不转义双引号的情况下将该映射转换为字符串吗?
我希望序列化地图看起来像
{"test1":"[{"key1":"value1","key2":"value2"}]"}
答:
0赞
Marcono1234
10/26/2023
#1
这是预期行为,无法禁用。显然,键的值是一个字符串,因此它包含的任何内容都必须转义;否则,它们会被误解为字符串的末尾。test1
"
例如,让我们看一下所需的 JSON 输出:
{"test1":"[{"key1":"value1","key2":"value2"}]"}
这实际上不是有效的 JSON。它从以下几点开始:
- 对象
{
- 名字
"test1"
- 字符串值
"[{"
- 名字
其余的无效。可以在支持 JSON 验证的本地编辑器(例如 VS Code)或 https://jsonlint.com/ 上看到这一点。
我认为这里的问题是您传递给 .你目前似乎通过了,但可能真的想通过.因此,在使用 Gson 之前,某些东西已经将映射值转换为 String。
如果您使用了 ,那么您将获得(可能是需要的)输出:Gson.toJson
HashMap<String, String>
HashMap<String, List<...>>
HashMap<String, List<...>>
{"test1":[{"key1":"value1","key2":"value2"}]}
(注意前后缺少值)"
评论