Gson 在 HashMap 序列化中转义双引号,即使使用 disableHtmlEscaping

Gson escaping double quotes in HashMap serialization even with disableHtmlEscaping

提问人:Jayden Chiu 提问时间:10/26/2023 最后编辑:Jayden Chiu 更新时间:10/26/2023 访问量:22

问:

我想使用 Gson 将 a 转换为 JSON 字符串,其中地图的值之一带有双引号。我不希望这些双引号被转义,但是当转换为带有 in my 的 JSON 字符串时,它仍然会转义双引号HashMapdisableHtmlEscapingGsonBuilder

我有一个带有以下 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"}]"}
java json 序列化 gson

评论


答:

0赞 Marcono1234 10/26/2023 #1

这是预期行为,无法禁用。显然,键的值是一个字符串,因此它包含的任何内容都必须转义;否则,它们会被误解为字符串的末尾。test1"

例如,让我们看一下所需的 JSON 输出:

{"test1":"[{"key1":"value1","key2":"value2"}]"}

这实际上不是有效的 JSON。它从以下几点开始:

  • 对象{
    • 名字"test1"
    • 字符串值"[{"

其余的无效。可以在支持 JSON 验证的本地编辑器(例如 VS Code)或 https://jsonlint.com/ 上看到这一点。

我认为这里的问题是您传递给 .你目前似乎通过了,但可能真的想通过.因此,在使用 Gson 之前,某些东西已经将映射值转换为 String。
如果您使用了 ,那么您将获得(可能是需要的)输出:
Gson.toJsonHashMap<String, String>HashMap<String, List<...>>HashMap<String, List<...>>

{"test1":[{"key1":"value1","key2":"value2"}]}

(注意前后缺少值)"