杰克逊JSON是否做了特殊的焦点逃脱?

时间:2011-01-12 19:37:38

标签: json jackson

我假设Jackson会在序列化期间自动转义特殊字符,即将“/ path /”序列化为“\ / path \ /”。看起来并非如此 - 至少开箱即用1.6:

@Test
public void testJacksonSerialize() throws Exception
{
    ObjectMapper om = new ObjectMapper();
    assertEquals("\\/path\\/", om.writeValueAsString("/path/"));
}

...失败 - 产生的输出是“/ path /”。我是否必须编写自己的序列化程序,或者有没有办法在杰克逊中启用特殊的字符串转义?

感谢, -nikita

3 个答案:

答案 0 :(得分:4)

杰克逊只能逃避强制性的事情。 “/”不是你必须逃避的东西,因此它不是。这符合JSON规范。

现在:如果你绝对想要转义,你可以使用方法来编写“原始”内容或值(在这种情况下,Jackson不进行任何处理并在输出中转储String)。

但你真的需要这样的逃避吗?我知道有些生成器会逃避它(由于我不知道的原因),但是没有解析器期望它,所以将斜杠保持未转义应该没问题。这与显然必须转义的反斜杠不同。

答案 1 :(得分:1)

斜杠“/”不需要在JSON中转义,因为它没有特殊含义。然而,由于以下原因,JSON 允许斜杠被转义。

如果您将JSON文本转储到< SCRIPT> HTML文本的元素,您必须确保文本中不出现双字符序列“< /”。该序列将根据HTML规则立即结束脚本元素。但是,如果JSON文本显示为“< \ /”,则它与JSON具有相同的含义,同时不会干扰HTML规则。因此,当且仅当它前面有一个小于号时,一些JSON生成器才会转义斜杠。

话虽这么说,我不知道你问题的直接答案(如何绝对逃脱杰克逊)。

答案 2 :(得分:0)

对于某些浏览器的Tooltip,新行字符不起作用。 不工作\ r \ n不工作或\ n不工作

使用双反斜杠跳过字符

解决方案:使用'\\ r \\ n'代替'\ r \ n',
它会解决你的问题。