【问题标题】:Escape forward slash in Jackson在杰克逊逃脱正斜线
【发布时间】:2011-07-25 14:16:31
【问题描述】:

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

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

如果某些字符串中包含'&lt;/script&gt;',则此代码会中断。转义正斜杠 (/) 可以解决问题,并且 JSON 的规范允许这样做。

如何在 Jackson 中启用它?

【问题讨论】:

标签: java json escaping jackson


【解决方案1】:

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

    }

【讨论】:

    【解决方案2】:

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

    此外,您还可以添加功能请求以添加简单的开/关功能,因为这个特定的东西听起来可能对其他人有用。但据我所知还没有具体要求。

    【讨论】:

    【解决方案3】:

    感谢 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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 2011-08-25
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多