Contents

Java Jackson/GSON 處理 JSON 搭配 ArrayList 泛型

ArrayList 做泛型必須要做特別動作,平常不常做,遇到這個問題需要特別處理。

Jackson 的 JSON 的ObjectMapper 做.getMapper().getTypeFactory().constructCollectionType可以解決這個問題。 這個目前套件Jackson 可以做到,GSON好像也能,但這邊就不深入。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public void test_list_string() {
    try {
        String listString = "[ \"1\",\"2\",\"3\" ]";
        JavaType stringCollection = JsonUtils.getMapper().getTypeFactory().constructCollectionType(List.class, String.class);
        List<String> dataList = JsonUtils.getMapper().readValue(listString, stringCollection);

        dataList.forEach(data -> System.out.println(String.format("data:%s", data)));

    } catch (Exception e) {
        e.printStackTrace();
    }
}

详解 Jackson 中的 ObjectMapper 类中的 readValue 方法对泛型的处理 | ckJava https://i.imgur.com/Azta6Lb.png

Jackson反序列化泛型List(使用JavaType将json字符串转换成泛型List) - 高木子 - 博客园

綜合比較

借助Jackson的JsonTypeInfo注解实现多态类的解析_bruce128的专栏-CSDN博客_jsontypeinfo

Jackson 最佳處理

1
2
3
tring expected="[{\"a\":12},{\"b\":23},{\"name\":\"Ryan\"}]";
CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, User.class);
List<User> userList = mapper.readValue(expected, listType);

解決ObjectMapper.convertValue() 遇到的一些問題 – WalkonNethttps://i.imgur.com/I0bzO8m.png
line-bot-sdk-java/Message.java at master · line/line-bot-sdk-java
gson/RuntimeTypeAdapterFactory.java at master · google/gson

特別處理

Jackson Json Subtype Mapping · Leo Niedermeier

【JAVA】从泛型中提取类进行json反序列化_zou15590的博客-CSDN博客

GSON 地雷??

Json反序列化与Java泛型 _weixin_33670786的博客-CSDN博客https://i.imgur.com/8VFQk9Y.png