我运行以下代码片段:
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 是否将字符串列表反序列化为默认值?ArrayList
TypeReference
ArrayList
List
LinkedList
TypeReference
LinkedList
ArrayList
是的,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)