杰克逊没有在 JSON 中转义引号

Posted

技术标签:

【中文标题】杰克逊没有在 JSON 中转义引号【英文标题】:Jackson not escaping quotes in JSON 【发布时间】:2013-11-21 03:52:01 【问题描述】:

我正在尝试将 json 放入 java 中的 javascript 文件中,但是当我将 json 写入字符串时,该字符串似乎不是 javascript 的有效 json;它缺少一些逃脱。 (这发生在我格式化为假 json 的 json 字符串中。)

例如,这将是我的 javascript 文件中的有效 json:


   "message": 
   "the following books failed: [\"book\": \"The Horse and his Boy\",\"author\": \"C.S. Lewis\", \"book\": \"The Left Hand of Darkness\",\"author\": \"Ursula K. le Guin\", ]"

这是我得到的,但是,双引号没有转义:


   "message": 
   "The following books failed: ["book": "The Horse and his Boy","author": "C.S. Lewis", "book": "The Left Hand of Darkness","author": "Ursula K. le Guin", ]"

当我这样做时,我得到了第二个结果:

new ObjectMapper().writer().writeValueAsString(booksMessage);

但是当我用jackson直接将它写入一个文件时,我得到了第一个很好的结果:

new ObjectMapper().writer().writeValue(fileToWriteTo, booksMessage);

那么为什么杰克逊在写入文件时会以不同的方式转义,以及在写入字符串时如何让它像我一样转义?

【问题讨论】:

您的“有效 json”是一种奇怪的格式。为什么在"The following books failed:... 相同的字符串中嵌入了一个看起来像数组的东西? 这就是我为该对象的 List 格式化 toString() 方法的输出的方式。当你在 JSON 中的 String 中看到它时,它看起来确实很奇怪。 【参考方案1】:

我参加聚会很晚了,但我遇到了类似的问题,我意识到这不是 Jackson 或我的数据的问题。那是Java。我正在读取 JSON 文件,然后尝试将其写入模板 html 文件。

我有一条和你一样的原始 JSON,类似于:

"field" : "This field contains what looks like another JSON field: \"abc\": \"value\""

当我将上述内容写入字符串时,abc 和 value 中的引号前的反斜杠消失了。我注意到 String.replaceAll 的上下文帮助提到了有关 Matcher.quoteReplacement 的内容。我是从这里开始的:

template = template.replaceAll("%template%", jsonDataString);

到这里:

Pattern pattern = Pattern.compile("%template%");
Matcher matcher = Pattern.matcher(template);
matcher.replaceAll(matcher.quoteReplacement(jsonDataString));

问题解决了。

Matcher.quoteReplacement

【讨论】:

【参考方案2】:

我加了

booksJson = Pattern.compile("\\\\").matcher(booksJson).replaceAll("\\\\\\\\");

转义所有转义字符。这样,当我将它写入文件并删除转义符时,我仍然有我需要的转义符。事实证明,我真正的问题是如何在不删除 Java 转义符的情况下写入文件。

【讨论】:

【参考方案3】:

ObjectWriter 类的writeValue() 方法对输入文本进行编码。

您不需要写入文件。获取相同字符串的另一种方法可能是:

StringWriter sw = new StringWriter();
new ObjectMapper().writer().writeValue(sw, booksMessage);
String result = sw.toString();

【讨论】:

这样做似乎并没有改变结果。我认为问题行实际上是我没有显示的:FileUtils.writeStringToFile(tempFile, booksJson, false); 似乎当我将其写入文件时"\"" 会变成""",而当杰克逊写入文件时它会保留 `` 转义字符。 我刚刚指出您仍然可以使用 writeValue() 方法。您在问题中描述的内容是模棱两可的,因为您似乎期望某些引号会被转义而其他引号不会。如果您将一些可编译的代码放在一起(1 种方法就足够了),只需少量输入和预期的输出,问题就会很容易解决(如果可以解决的话)。 好东西,它删除了不必要的转义字符并保留了引号的转义字符,因此 JSON 编译得很好。谢谢!

以上是关于杰克逊没有在 JSON 中转义引号的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中转义字符串

如何在 Sybase 中转义单引号

我可以在逐字字符串文字中转义双引号吗?

我可以在逐字字符串文字中转义双引号吗?

如何在 Presto 中转义单引号?

如何在 MySQL 中转义单引号