程式狂想筆記

一個攻城師奮鬥史

0%

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 備份圖

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() 遇到的一些問題 – WalkonNet備份圖
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博客備份圖