Jackson默认将列表反序列化为ArrayList吗?

exp*_*ter 1 java json jackson

我运行以下代码片段:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class JsonMapper {
    public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    public static <T> String toJson(final T object) throws JsonProcessingException {
        return OBJECT_MAPPER.writeValueAsString(object);
    }

    public static <T> T fromJson(final String json, final Class<T> clazz) throws IOException {
        return OBJECT_MAPPER.readValue(json, clazz);
    }

    public static <T> T fromJson(final String json, final TypeReference<T> type) throws IOException {
        return OBJECT_MAPPER.readValue(json, type);
    }
    public static void main(String args[]) throws IOException {
        String json = "[1,2,3]";
        // TEST1: initialize TypeReference with type ArrayList
        List<Integer> expected = JsonMapper.fromJson(json, new TypeReference<ArrayList<Integer>>(){});
        System.out.println(expected.getClass().getName());
        // TEST2: initialize TypeReference with type List
        expected = JsonMapper.fromJson(json, new TypeReference<List<Integer>>(){});
        System.out.println(expected.getClass().getName());
        // TEST3: initialize TypeReference with type LinkedList
        expected = JsonMapper.fromJson(json, new TypeReference<LinkedList<Integer>>(){});
        System.out.println(expected.getClass().getName());

    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

java.util.ArrayList
java.util.ArrayList
java.util.LinkedList
Run Code Online (Sandbox Code Playgroud)

当我用 type或初始化时,变量的类型expected是,但如果我用 type初始化,它就变成了。那么,jackson 是否将字符串列表反序列化为默认值?ArrayListTypeReferenceArrayListListLinkedListTypeReferenceLinkedListArrayList

exp*_*ter 6

是的,jackson 默认将字符串列表反序列化为 ArrayList。代码在com.fasterxml.jackson.databind.deser.impl.CreatorCollector类中:

    @Override
    public Object createUsingDefault(DeserializationContext ctxt) throws IOException {
        switch (_type) {
        case TYPE_COLLECTION: return new ArrayList<Object>();
        case TYPE_MAP: return new LinkedHashMap<String,Object>();
        case TYPE_HASH_MAP: return new HashMap<String,Object>();
        }
        throw new IllegalStateException("Unknown type "+_type);
    }
Run Code Online (Sandbox Code Playgroud)

  • 知道如何自定义正在使用的默认数组类型吗? (3认同)