杰克逊是否默认将列表反序列化为ArrayList?

时间:2016-11-16 14:42:01

标签: 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());

    }
}

输出是:

java.util.ArrayList
java.util.ArrayList
java.util.LinkedList

当我使用expectedArrayList类型初始化TypeReference时,变量ArrayList的类型为List,但如果我成为LinkedList使用类型TypeReference初始化LinkedList。那么,杰克逊是否会将字符串列表反序列化为ArrayList默认值?

1 个答案:

答案 0 :(得分:1)

是的,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);
    }