2015-12-22 53 views
2

杰克逊定制逃逸对象映射器返回错误的输出字符串长度超过2000字符大使用自定义逃逸杰克逊对象映射器有限制的字段长度

我使用杰克逊逃脱一些特殊字符(<,>,” “)从数据。我输入地图的<Object,Object>。除了这个特殊的输入中的字符串长度大于2000个字符的大型IT工作正常。

下面就是我使用杰克逊的主要功能。

Map<Object,Object> specialMap = new HashMap<>(); 
    specialMap.put("id", "482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863"); 
    String result = null; 
    ObjectMapper objectMapper = new ObjectMapper(); 
    try { 
     //Escaping Special Characters 
     objectMapper.getJsonFactory().setCharacterEscapes(new XMLCharacterEscapes()); 
     result = objectMapper.writeValueAsString(specialMap); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  

这里Result变量应包含字符串逃过值。但是对于这个特定的输入(specialMap)它给出了未预期\\0字符序列。

XMLCharacterEscapes

public class XMLCharacterEscapes extends CharacterEscapes { 
private final int[] asciiEscapes; 

public XMLCharacterEscapes() 
{ 
    // start with set of characters known to require escaping (double-quote, backslash etc) 
    int[] esc = CharacterEscapes.standardAsciiEscapesForJSON(); 
    // Five chars are predefined in XML and require escaping 
    esc['<'] = CharacterEscapes.ESCAPE_CUSTOM; 
    esc['>'] = CharacterEscapes.ESCAPE_CUSTOM; 
    esc['&'] = CharacterEscapes.ESCAPE_CUSTOM; 
    esc['\''] = CharacterEscapes.ESCAPE_CUSTOM; 
    esc['\"'] = CharacterEscapes.ESCAPE_CUSTOM; 
    asciiEscapes = esc; 
} 
// this method gets called for character codes 0 - 127 
@Override public int[] getEscapeCodesForAscii() { 
    return asciiEscapes; 
} 
// and this for others; we don't need anything special here 
@Override public SerializableString getEscapeSequence(int ch) { 
    return new EscapedSerializableString(ch); 
} 
} 

EscapedSerializableString

public class EscapedSerializableString implements SerializableString { 

private final String stringValue; 

public EscapedSerializableString(int i) { 
    stringValue = Character.toString((char) i); 
} 

@Override 
public String getValue() { 
    return StringEscapeUtils.escapeXml11(stringValue); 
} 

@Override 
public int charLength() { 
    return stringValue.length(); 
} 

@Override 
public char[] asQuotedChars() { 
    return new char[0]; 
} 

@Override 
public byte[] asUnquotedUTF8() { 
    return new byte[0]; 
} 

@Override 
public byte[] asQuotedUTF8() { 
    return new byte[0]; 
} 
} 

回答

1

这里是一个gist与Groovy脚本代码的工作版本。

有代码中的几个语法错误,你也应该检查你所使用的杰克逊的版本。 我不明白它的值应该在你输入字符串进行转义,所以我加了获得逃脱的标签。

import org.codehaus.jackson.SerializableString 
import org.codehaus.jackson.io.CharacterEscapes 
/** 
* Created by Marc Nuri on 2015-12-23. 
*/ 
@Grab('org.codehaus.jackson:jackson-core-asl:1.9.13') 
@Grab('org.codehaus.jackson:jackson-mapper-asl:1.9.13') 
@Grab('org.apache.commons:commons-lang3:3.4') 

Map<Object,Object> specialMap = new HashMap<>(); 
specialMap.put("id", "<EscapedTag>482863</EscapedTag>,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863"); 
String result = null; 
org.codehaus.jackson.map.ObjectMapper objectMapper = new org.codehaus.jackson.map.ObjectMapper(); 
try { 
    //Escaping Special Characters 
    objectMapper.getJsonFactory().setCharacterEscapes(new CharacterEscapes() { 
     private static final int[] esc; 
     static{ 
      esc = CharacterEscapes.standardAsciiEscapesForJSON(); 
      esc[(int)'<'] = CharacterEscapes.ESCAPE_CUSTOM; 
      esc[(int)'>'] = CharacterEscapes.ESCAPE_CUSTOM; 
      esc[(int)'&'] = CharacterEscapes.ESCAPE_CUSTOM; 
      esc[(int)'\''] = CharacterEscapes.ESCAPE_CUSTOM; 
      esc[(int)'\"'] = CharacterEscapes.ESCAPE_CUSTOM; 
     } 

     @Override 
     int[] getEscapeCodesForAscii() { 
      return esc 
     } 

     @Override 
     SerializableString getEscapeSequence(final int i) { 
      return new SerializableString() { 

       private final String stringValue = Character.toString((char) i); 



       @Override 
       public String getValue() { 
        return org.apache.commons.lang3.StringEscapeUtils.escapeXml11(stringValue); 
       } 

       @Override 
       public int charLength() { 
        return stringValue.length(); 
       } 

       @Override 
       public char[] asQuotedChars() { 
        return new char[0]; 
       } 

       @Override 
       public byte[] asUnquotedUTF8() { 
        return new byte[0]; 
       } 

       @Override 
       public byte[] asQuotedUTF8() { 
        return new byte[0]; 
       } 

      } 
     } 
    }); 
    result = objectMapper.writeValueAsString(specialMap); 
    println result; 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

这里是脚本输出:

{"id":"&lt;EscapedTag&gt;482863&lt;/EscapedTag&gt;,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863,482863"} 
+0

嗨马克,看起来像我用的是杰克逊的旧版本和字符转义。现在问题解决了。 –

相关问题