逃离杰克逊的斜线

Inf*_*igo 10 java json escaping jackson

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

   <script>
     var data = $SomeJacksonWrapper.toJson($data);
   </script>
Run Code Online (Sandbox Code Playgroud)

如果包含一些字符串'</script>',则此代码会中断.转义正斜杠(/)将解决问题,并且它由JSON的规范赋予.

我如何在杰克逊中启用它?

Inf*_*igo 9

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

    }
Run Code Online (Sandbox Code Playgroud)


Sta*_*Man 8

除了其他建议,Jackson 1.8还具有" 角色逃脱 "功能,允许重新定义逃避规则.缺少文档,但基本上你需要实现CharacterEscapes(参见http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape),注册JsonFactory(或直接注册JsonGenerator),然后逃避将根据您想要的任何规则进行.在这种情况下,您只需更改"/"的设置即可使用ESCAPE_STANDARD.

此外,您还可以添加功能请求以添加简单的开/关功能,因为这个特定的事情听起来也可能对其他人有用.但据我所知,尚未特别要求.

  • 好的博客文章解释了如何在杰克逊中逃避特定的角色:http://www.cowtowncoder.com/blog/archives/2012/08/entry_476.html (4认同)

小智 7

由于StaxMan这里Infeligo的答案(欢呼家伙),我找到了一种方法来提供转义/匹配(恕我直言可怕)WCF DataContractJsonSerializer日期标准格式:

/Date(1328053610008+1100)/
Run Code Online (Sandbox Code Playgroud)

这需要使用反斜杠进行转义,从而导致以下内容:

\/Date(1328053610008+1100)\/
Run Code Online (Sandbox Code Playgroud)

为了防止其他人在这里,我使用的是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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)