2011-07-25 47 views
8

我用傑克遜生成JSON對象並將其直接寫入HTML的標籤,就像這樣:逃生斜線傑克遜

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

此代碼休息,如果一些字符串包含在它'</script>'。轉義正斜槓(/)可以解決問題,JSON規範也可以解決這個問題。

如何在Jackson中啓用它?

+0

你能不能做逸出$的數據? –

+0

查看http://stackoverflow.com/questions/5006185/how-to-html-escape-values-by-jackson-generator – bstick12

回答

7

除了其他建議,傑克遜1.8還具有「character escapes」功能,它允許重新定義轉義規則。缺少文檔,但基本上需要實現CharacterEscapes(請參閱http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape),向JsonFactory(或直接JsonGenerator)註冊,然後根據所需的任何規則進行轉義。在這種情況下,您可以更改'/'的設置以使用ESCAPE_STANDARD。

此外,您還可以添加功能請求以添加簡單的開/關功能,因爲此特定的東西聽起來可能對其他人也有用。但據我所知,尚未具體要求。

+4

解釋如何逃避傑克遜特定字符的好博客條目:http://www.cowtowncoder。 com/blog/archives/2012/08/entry_476.html – linqu

+0

傑克遜真的很糟糕。這個庫有一種方法可以讓事情變得如此複雜! – Moebius

7

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

    } 
6

感謝StaxMan和Infeligo的答案在這裏(歡呼傢伙),我找到了一種方法來提供轉義/匹配(IMHO可怕)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; 
     } 
    } 
} 
+0

這有幫助。謝謝! – dmon