我使用Jackson生成JSON对象并将其直接写入HTML的标记中,如下所示:
<script> var data = $SomeJacksonWrapper.toJson($data); </script>
如果某个字符串中包含'</script>',则此代码会中断。转义正斜杠(/)将解决此问题,这是JSON规范所允许的。如何在Jackson中启用它?
'</script>'
7ivaypg91#
使用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()); } }
nc1teljy2#
除了其他建议,Jackson 1.8还有“character escapes“特性,它允许重新定义转义规则,缺少文档,但基本上需要实现CharacterEscapes(请参阅http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape),向JsonFactory注册(或直接使用JsonGenerator)、然后将根据所需规则进行转义在这种情况下,您只需更改'/'设置以使用ESCAPE_STANDARD此外,您还可以添加一个功能请求来添加简单的开/关功能,因为这个特定的东西听起来可能对其他人也有用。但据我所知,还没有被具体请求。
CharacterEscapes
5jdjgkvh3#
感谢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; } } }
vyswwuz24#
Kotlin版本的正斜杠自定义字符转义:
/** * Behaves like PHP json_encode() in that forward slashes are escaped. */ private class PhpCompatJsonEncode : CharacterEscapes() { private val delegate = JsonpCharacterEscapes() private val escapeForSlash = SerializedString("\\/") private val asciiEscapes = standardAsciiEscapesForJSON() init { asciiEscapes['/'.code] = ESCAPE_CUSTOM } override fun getEscapeCodesForAscii(): IntArray { return asciiEscapes } override fun getEscapeSequence(ch: Int): SerializableString? { return when (ch) { '/'.code -> escapeForSlash else -> delegate.getEscapeSequence(ch) } } }
如果只在特定位置需要,也可以针对每个写入程序配置此选项,而不是全局配置:
val writer: ObjectWriter = objectMapper.writer(PhpCompatJsonEncode())
4条答案
按热度按时间7ivaypg91#
使用StaxMan的答案,我得到了下面的代码:
nc1teljy2#
除了其他建议,Jackson 1.8还有“character escapes“特性,它允许重新定义转义规则,缺少文档,但基本上需要实现
CharacterEscapes
(请参阅http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape),向JsonFactory注册(或直接使用JsonGenerator)、然后将根据所需规则进行转义在这种情况下,您只需更改'/'设置以使用ESCAPE_STANDARD此外,您还可以添加一个功能请求来添加简单的开/关功能,因为这个特定的东西听起来可能对其他人也有用。但据我所知,还没有被具体请求。
5jdjgkvh3#
感谢StaxMan和Infeligo在这里的回答(欢呼伙计们)我找到了一种方法来提供转义/匹配(恕我直言可怕)WCF DataContractJsonSerializer日期标准格式:
这需要使用反斜杠转义/,从而在整个网络中产生以下结果:
以防万一,它可能会帮助别人这里是我的CustomCharacterEscapes代码,我用:
vyswwuz24#
Kotlin版本的正斜杠自定义字符转义:
如果只在特定位置需要,也可以针对每个写入程序配置此选项,而不是全局配置: