【问题标题】:Escape forward slash in Jackson在杰克逊逃脱正斜线
【发布时间】:2011-07-25 14:16:31
【问题描述】:
我使用 Jackson 生成 JSON 对象,并直接将它们写入 HTML 的标签中,如下所示:
<script>
var data = $SomeJacksonWrapper.toJson($data);
</script>
如果某些字符串中包含'</script>',则此代码会中断。转义正斜杠 (/) 可以解决问题,并且 JSON 的规范允许这样做。
如何在 Jackson 中启用它?
【问题讨论】:
标签:
java
json
escaping
jackson
【解决方案1】:
使用 StaxMan 的答案,我得到了以下代码:
public class CustomCharacterEscapes extends CharacterEscapes {
private static final Logger log = Logger.getLogger(CustomCharacterEscapes.class);
private final int[] _asciiEscapes;
public CustomCharacterEscapes() {
_asciiEscapes = standardAsciiEscapesForJSON();
_asciiEscapes['/'] = CharacterEscapes.ESCAPE_STANDARD;
}
@Override
public int[] getEscapeCodesForAscii() {
return _asciiEscapes;
}
@Override
public SerializableString getEscapeSequence(int i) {
return null;
}
}
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
this.getJsonFactory().setCharacterEscapes(new CustomCharacterEscapes());
}
}
【解决方案3】:
感谢 StaxMan 和 Infeligo 在这里的回答(大家好),我找到了一种方法来为/匹配(恕我直言可怕)WCF DataContractJsonSerializer 日期标准格式提供转义:
/Date(1328053610008+1100)/
这要求 / 用反斜杠转义,从而导致以下内容:
\/Date(1328053610008+1100)\/
以防万一它可以帮助其他人这里是我使用的 CustomCharacterEscapes 代码:
public class CustomCharacterEscapes extends CharacterEscapes {
private final int[] _asciiEscapes;
public CustomCharacterEscapes() {
_asciiEscapes = standardAsciiEscapesForJSON();
_asciiEscapes['/'] = CharacterEscapes.ESCAPE_CUSTOM;
}
@Override
public int[] getEscapeCodesForAscii() {
return _asciiEscapes;
}
@Override
public SerializableString getEscapeSequence(int i) {
if(i == '/'){
return new SerializableString() {
@Override
public String getValue() {
return "\\/";
}
@Override
public int charLength() {
return 2;
}
@Override
public char[] asQuotedChars() {
return new char[]{'\\','/'};
}
@Override
public byte[] asUnquotedUTF8() {
return new byte[]{'\\','/'};
}
@Override
public byte[] asQuotedUTF8() {
return new byte[]{'\\','/'};
}
};
}
else{
return null;
}
}
}