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);

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

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

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

4

3 回答 3

6

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

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

StringWriter sw = new StringWriter();
new ObjectMapper().writer().writeValue(sw, booksMessage);
String result = sw.toString();
于 2013-11-09T01:01:11.127 回答
2

我添加了

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

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

于 2013-11-09T03:15:07.050 回答
0

我参加聚会很晚了,但我遇到了类似的问题,我意识到这不是杰克逊或我的数据的问题。那是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

于 2018-08-24T21:12:41.647 回答