2011-07-25 23 views
8

utilizo Jackson para generar objetos JSON y escribir directamente en la etiqueta de HTML, como esto:Escapar barra diagonal en Jackson

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

rompe este código si alguna cadena contiene '</script>' en ella. El escape de la barra inclinada (/) resolvería el problema y está protegido por las especificaciones de JSON.

¿Cómo lo habilito en Jackson?

+0

se puede no hacer el escape en $ data? –

+0

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

Respuesta

7

Además de otras sugerencias, Jackson 1.8 también tiene la función "character escapes", que permite la redefinición de las reglas de escape. Falta documentación, pero básicamente necesita implementar CharacterEscapes (ver http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape), registrarse con JsonFactory (o directamente JsonGenerator), y luego escaparse se hará de acuerdo con las reglas que desee. En este caso, puede cambiar la configuración de '/' para usar ESCAPE_STANDARD.

Además, también puede agregar una solicitud de función para agregar una función de activación/desactivación simple, ya que esta característica específica parece que también podría ser útil para otras personas. Pero, hasta donde yo sé, aún no se ha solicitado específicamente.

+4

buena entrada de blog explicando cómo escapar de caracteres específicos en jackson: http: //www.cowtowncoder. com/blog/archives/2012/08/entry_476.html – linqu

+0

Jackson realmente apesta. ¡Esta biblioteca tiene una manera de hacer que las cosas sean tan simples! – Moebius

7

Usando respuesta StaxMan 's, que terminó con el siguiente código:

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

Gracias a StaxMan y respuestas de Infeligo aquí (aplausos hombres) he encontrado una manera de proporcionar escapar de/para que coincida con el (francamente horrible) fecha WCF DataContractJsonSerializer formato estándar:

/Date(1328053610008+1100)/ 

que requiere que el/a puede escapar con una barra invertida dando como resultado el siguiente a través del cable:

\/Date(1328053610008+1100)\/ 

Sólo en caso de que puede ayudar a alguien más aquí es mi código CustomCharacterEscapes que utilicé:

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

Eso ayudó. ¡Gracias! – dmon

Cuestiones relacionadas