杰克逊在JSON中未转义引号

15

我想把一个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);

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


你的“valid json”格式很奇怪。为什么在相同的字符串中嵌入了一个看起来像数组的东西和“以下图书失败:…”? - nnnnnn
这只是我对一个包含该对象的List的toString()方法输出格式进行的调整。当您在JSON字符串中看到它时,它看起来确实很奇怪。 - CorayThan
3个回答

6
ObjectWriter类的writeValue()方法对输入文本进行编码。
不需要写入文件,获取相同字符串的另一种方法是:
StringWriter sw = new StringWriter();
new ObjectMapper().writer().writeValue(sw, booksMessage);
String result = sw.toString();

以那种方式做似乎并没有改变结果。我认为问题出在我没有展示的那一行代码上:FileUtils.writeStringToFile(tempFile, booksJson, false); 当我将其写入文件时,"\""会变成""",而当Jackson写入文件时,它会保留\转义字符。 - CorayThan
我只是指出您仍然可以使用writeValue()方法。您在问题中描述的含义不明确,因为您似乎希望某些引号被转义,而其他引号则不需要。如果您编写一些可编译的代码(一个方法就足够了),并提供一些小的输入和期望的输出,那么问题将很容易解决(如果可以解决)。 - PNS
好东西,它删除了不必要的转义字符,并保留了引号的转义字符,因此JSON编译得很好。谢谢! - Torsten Ojaperv

2
我添加了

标签


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

这里需要使用转义字符来避免所有的转义。这样当我将其写入文件并移除转义时,仍然可以保留所需的转义。因此,我的真正问题是如何在不移除Java转义的情况下写入文件。


0
我来晚了,但是我也遇到了类似的问题。后来我发现这不是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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接