java - 具有自定义转义的 Jackson Object Mapper 对字段长度有限制

标签 java json jackson escaping

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

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

下面是我使用 Jackson 的 Main 函数。

    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];
}
}

最佳答案

这是一个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":"&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"}

关于java - 具有自定义转义的 Jackson Object Mapper 对字段长度有限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34409083/

相关文章:

java - 如何解密 SHA-256 加密字符串?

java - 为什么 mockito 在 java 7 中报告 thenReturn() 错误但在 java 6 中不报告错误

java - 如何将 Json String 映射到 POJO?

java - 使用 Jackson 将 MongoDB 日期字段反序列化为 Java POJO

android - Android中使用GSON解析复杂的JSON对象

Java - 在没有 POJO 的情况下递归地从 JSON 字符串中删除字段

java - 在 React-Native 中使用 Android 运行 CodePush

java - Java类对象的重用

iphone - 将新的 Apple Framework 类适应以前的 iOS SDK

javascript - Vue.js:更新数据库中的子json数据格式