Java 具有自定义转义的Jackson对象映射器对字段长度有限制

Java 具有自定义转义的Jackson对象映射器对字段长度有限制,java,json,jackson,escaping,Java,Json,Jackson,Escaping,带有自定义转义的Jackson对象映射器对于大于2000个字符的字符串返回错误输出 我正在使用jackson从数据中转义一些特殊字符(,“,”)。我的输入是的映射。除了字符串长度大于2000个字符的特殊输入外,它工作正常 下面是我使用Jackson的主要功能 Map<Object,Object> specialMap = new HashMap<>(); specialMap.put("id", "482863,482863,482863,482863,4

带有自定义转义的Jackson对象映射器对于大于2000个字符的字符串返回错误输出

我正在使用jackson从数据中转义一些特殊字符(,“,”)。我的输入是
的映射。除了字符串长度大于2000个字符的特殊输入外,它工作正常

下面是我使用Jackson的主要功能

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

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);
}
}
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];
}
}
下面是一个示例,其中包含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":"&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"}