I run the following code snippet:
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());
}
}
the output is:
java.util.ArrayList
java.util.ArrayList
java.util.LinkedList
The type of variable expected
is ArrayList
when I initialize TypeReference
with type ArrayList
or List
, but it becomes LinkedList
if I initialize TypeReference
with type LinkedList
. So, does jackson deserialize a string list to ArrayList
in default?
Yes, jackson deserialize a string list to ArrayList in default. The code is in com.fasterxml.jackson.databind.deser.impl.CreatorCollector
class:
@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);
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.