如何(完全)将json反序列化为通用List?

时间:2017-03-22 09:18:12

标签: java generics jackson json-deserialization

使用ObjectMapper将json String转换为实体时,我可以将其设为通用:

public <E> E getConvertedAs(String body, Class<E> type) throws IOException {
    return mapper.readValue(body, type);
}

现在让我们说我想阅读馆藏。我能做到:

List<SomeEntity> someEntityList = asList(mapper.readValue(body, SomeEntity[].class));
List<SomeOtherEntity> someOtherEntityList = asList(mapper.readValue(body, SomeOtherEntity[].class));

我想写一个上面的等效方法,但是对于集合。由于你不能在java中使用泛型数组,所以这样的东西不起作用:

public <E> List<E> getConvertedListAs(String body, Class<E> type) {
    return mapper.readValue(body, type[].class);
}

Here有一个解决方案几乎可行:

mapper.readValue(jsonString, new TypeReference<List<EntryType>>() {});

问题是它没有反序列化为E的列表,而是LinkedHashMap.Entry的列表。有没有什么方法可以更进一步,如下所示?

public <E> List<E> getConvertedListAs(String body, Class<E> type) {
    mapper.readValue(body, new TypeReference<List<type>>() {}); // Doesn't compile
}

2 个答案:

答案 0 :(得分:2)

此方法可以帮助读取json对象或集合:

public class JsonUtil {
    private static final ObjectMapper mapper = new ObjectMapper();

    public static <T>T toObject(String json, TypeReference<T> typeRef){
        T t = null;
        try {
            t = mapper.readValue(json, typeRef);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return t;
    }
}

阅读json列表:

List<Device> devices= JsonUtil.toObject(jsonString,
                            new TypeReference<List<Device>>() {});

将json读取到对象:

Device device= JsonUtil.toObject(jsonString,
                                new TypeReference<Device>() {});

答案 1 :(得分:0)

public static <E> List<E> fromJson(String in_string, Class<E> in_type) throws JsonParseException, JsonMappingException, IOException{
    return new ObjectMapper().readValue(in_string, new TypeReference<List<E>>() {});
}

在我的电脑上编译。 请注意,我还没有测试过它。