Побег слеш в Джексоне - PullRequest
10 голосов
/ 25 июля 2011

Я использую Джексона для генерации объектов JSON и записи их непосредственно в тег HTML, например:

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

Этот код прерывается, если в какой-либо строке содержится '</script>'.Удаление косой черты (/) решило бы проблему, и это допускается спецификацией JSON.

Как включить ее в Джексоне?

Ответы [ 3 ]

9 голосов
/ 26 июля 2011

Используя 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());
     }

    }
8 голосов
/ 25 июля 2011

В дополнение к другим предложениям, Jackson 1.8 также имеет функцию " символ экранирования ", которая позволяет переопределять правила экранирования.Документация отсутствует, но в основном вам нужно внедрить CharacterEscapes (см. http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape), зарегистрироваться в JsonFactory (или непосредственно в JsonGenerator), и тогда экранирование будет выполняться в соответствии с любыми правилами, которые вы хотите. В этом случае вы можете просто изменитьнастройки для '/', чтобы использовать ESCAPE_STANDARD.

Кроме того, вы также можете добавить запрос функции, чтобы добавить простую функцию включения / выключения, так как эта конкретная вещь звучит так, как будто она может быть полезна и для других. Но пока нетбыл запрошен специально, насколько я знаю.

7 голосов
/ 01 февраля 2012

Благодаря ответам 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...