Jackson中的转义正斜杠

2exbekwf  于 2022-11-08  发布在  其他
关注(0)|答案(4)|浏览(192)

我使用Jackson生成JSON对象并将其直接写入HTML的标记中,如下所示:

<script>
     var data = $SomeJacksonWrapper.toJson($data);
   </script>

如果某个字符串中包含'</script>',则此代码会中断。转义正斜杠(/)将解决此问题,这是JSON规范所允许的。
如何在Jackson中启用它?

7ivaypg9

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

    }
nc1teljy

nc1teljy2#

除了其他建议,Jackson 1.8还有“character escapes“特性,它允许重新定义转义规则,缺少文档,但基本上需要实现CharacterEscapes(请参阅http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape),向JsonFactory注册(或直接使用JsonGenerator)、然后将根据所需规则进行转义在这种情况下,您只需更改'/'设置以使用ESCAPE_STANDARD
此外,您还可以添加一个功能请求来添加简单的开/关功能,因为这个特定的东西听起来可能对其他人也有用。但据我所知,还没有被具体请求。

5jdjgkvh

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;
        }
    }
}
vyswwuz2

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

相关问题