2011-07-25 12 views
8

używam Jacksona generowanie obiektów JSON i zapisać je bezpośrednio w tagu HTML, podobnie jak to:Ucieczka ukośnik w Jackson

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

przerwy ten kod jeśli jakiś ciąg zawiera '</script>' w nim. Ucieczka przedniego ukośnika (/) rozwiązałby problem i jest on określony przez specyfikację JSON.

Jak włączyć to w Jackson?

+0

mógłbyś nie wykonać ucieczkę w $ dane? –

+0

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

Odpowiedz

7

Oprócz innych sugestii, Jackson 1.8 ma również funkcję "character escapes", która pozwala na zdefiniowanie nowych reguł ucieczki. Brakuje dokumentacji, ale zasadniczo musisz zaimplementować CharacterEscapes (patrz http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape), zarejestrować się w JsonFactory (lub bezpośrednio JsonGenerator), a następnie uciec zostanie wykonane zgodnie z dowolnymi regułami. W takim przypadku możesz po prostu zmienić ustawienia "/", aby użyć ESCAPE_STANDARD.

Dodatkowo można również dodać zapytanie o funkcję, aby dodać prostą funkcję włączania/wyłączania, ponieważ może to być przydatne dla innych osób. Ale o ile wiem, nie został jeszcze zgłoszony.

+4

dobry wpis na blogu wyjaśniający, jak uciec przed określonymi postaciami w jackson: http: //www.cowtowncoder. com/blog/archives/2012/08/entry_476.html – linqu

+0

Jackson naprawdę jest do bani. Ta biblioteka ma sposób na uproszczenie rzeczy tak skomplikowanych! – Moebius

7

Korzystanie odpowiedź StaxMan dydaktycznego, skończyło się za pomocą następującego kodu:

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

Dzięki StaxMan i odpowiedzi Infeligo tu (okrzyki faceci) znalazłem sposób, aby zapewnić ucieczkę do/dopasować (IMHO straszne) data WCF DataContractJsonSerializer standardowy format:

/Date(1328053610008+1100)/ 

który wymaga/być uciekł z backslash w wyniku następujących po drugiej stronie drutu:

\/Date(1328053610008+1100)\/ 

Tylko w przypadku, może to pomoże ktoś tutaj jest mój kod CustomCharacterEscapes że użyłem:

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

To pomogło. Dzięki! – dmon