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

mm5n2pyu  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(176)

我想用Gson将HashMap转换为JSON字符串,其中一个map的值有双引号。我不希望这些双引号被转义,但当在我的GsonBuilder中转换为带有disableHtmlEscaping的JSON字符串时,它仍然会转义双引号
我有一个HashMap,其中包含以下String键和String值

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

字符串
当我尝试用gson序列化这个Map时,禁用了HTML转义,代码如下:

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
return gson.toJson(map);


它返回以下字符串:

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


还试探着:

  • 在序列化之前手动转义字符串
  • setPrettyPrinting
  • 将map转换为JsonTree,并使用getAsString和toString将其作为String获取

有没有人能帮我弄清楚我做错了什么,以及如何在不转义双引号的情况下将Map转换为字符串?
我希望序列化的Map看起来像

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

z3yyvxxp

z3yyvxxp1#

这是预期的行为,不能禁用。显然,test1键的值是一个字符串,所以它包含的任何"都必须被转义;否则它们会被误解为字符串的结尾。
例如,让我们看看你想要的JSON输出:

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

字符串
这实际上不是有效的JSON。它以以下开头:

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

您可以在本地编辑器中看到这一点,该编辑器支持JSON验证(例如VS Code)或https://jsonlint.com/
我假设这里的问题是你传递给Gson.toJson的数据。你目前似乎传递了HashMap<String, String>,但实际上可能想传递HashMap<String, List<...>>。所以在你使用Gson之前,已经有东西把map值转换成了String。
如果你使用HashMap<String, List<...>>,那么你会得到(可能想要的)输出:

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


(note值前后缺少的"

相关问题