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];
}
}
嗨马克,看起来像我用的是杰克逊的旧版本和字符转义。现在问题解决了。 –