杰克逊没有在 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 中转义引号的主要内容,如果未能解决你的问题,请参考以下文章