带有自定义转义的Jackson Object Mapper为大于2000字符的字符串返回错误输出
我正在使用杰克逊从数据中逃避一些特殊字符(&lt;,&gt;,&#39;,&#34;)。我的输入是<Object,Object>
的地图。除了字符串长度大于2000个字符的特殊输入外,它工作正常。
以下是我使用杰克逊的主要功能。
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];
}
}
答案 0 :(得分:1)
这是一个gist,其中包含一个groovy脚本中代码的工作版本。
您的代码中存在一些语法错误,您还应该检查您正在使用的Jackson版本。 我不明白应该在输入字符串中转义哪些值,因此我添加了一个标记以进行转义。
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":"<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"}