数仓中的JSON串困扰了我,格式化Object转为 List 到底有多坑
曾经年少爱追梦,一心只想往前飞。
最近在做报表的需求,中间数仓表存储的是大量的JSON字符串,处理起来真的是太过于繁琐,没有明确的POJO,可能是List<Map<…>>格式,完全是单个key单个key去取值。个人总结下其中的一些场景【Object转为 List】,首先确保 Object
的真实类型是 ArrayList<Pojo>
或 ArrayList<LinkedHashMap>
。
在 Java 中将 Object
转换为 List
时,具体方式取决于 Object
的实际类型和内容。以下是几种常见的方式:
1. 使用强制类型转换
(前提是明确类型)
如果确定 Object
本身就是一个 List
,可以直接进行强制类型转换:
Object obj = Arrays.asList("A", "B", "C");
List<String> list = (List<String>) obj; // 直接转换
注意: 如果 obj
不是 List
类型,直接转换会抛出 ClassCastException
。
2. 使用 instanceof
检查类型
为避免 ClassCastException
,可以使用 instanceof
判断类型:
if (obj instanceof List) {
List<String> list = (List<String>) obj;
} else {
throw new IllegalArgumentException("Object is not a List");
}
3. 通过 JSON 序列化和反序列化
(个人推荐这种方式。站在巨人的肩膀上,更容易成功)
如果 Object
实际是 JSON 数据(如 JSONArray
或 JSON 字符串),可以使用 JSON 工具库转换为 List
:
使用 Jackson:
ObjectMapper objectMapper = new ObjectMapper();
List<String> list = objectMapper.convertValue(obj, new TypeReference<List<String>>() {});
使用 Gson:
Gson gson = new Gson();
List<String> list = gson.fromJson(gson.toJson(obj), new TypeToken<List<String>>() {}.getType());
使用 FastJSON:
List<String> list = JSON.parseArray(JSON.toJSONString(obj), String.class);
4. 手动处理 ArrayList
和其他集合
如果 Object
是某种集合类型(如 ArrayList
或 HashSet
),但类型未知,可将其转换为 List
:
if (obj instanceof Collection) {
List<Object> list = new ArrayList<>((Collection<?>) obj);
}
5. 通过 Stream
API 转换
如果 Object
是数组或其他集合,可以通过 Stream
转换为 List
:
if (obj instanceof Object[]) {
List<Object> list = Arrays.stream((Object[]) obj).collect(Collectors.toList());
}
6. 处理 LinkedHashMap
类型的 List
如果 Object
是 List<LinkedHashMap>
类型(如通过 JSON 反序列化产生的数据),可以将其进一步转换为目标 POJO:
List<LinkedHashMap<String, Object>> tempList = (List<LinkedHashMap<String, Object>>) obj;
List<MyPojo> pojoList = tempList.stream()
.map(map -> objectMapper.convertValue(map, MyPojo.class))
.collect(Collectors.toList());
7. 转换带有泛型的 List
当目标 List
的泛型类型未知时,可以利用通配符或反射动态转换:
Object obj = Arrays.asList("A", "B", "C");
List<?> list = (List<?>) obj; // 使用通配符处理未知泛型
注意事项
- 类型安全:确保
Object
的实际类型和目标List
类型一致。 - 避免强制转换异常:使用
instanceof
或 JSON 工具类更安全。 - Null 检查:转换前确保
Object
不为null
,或者使用默认值。
根据实际需求选择适合的方式。对于复杂类型的 Object
,使用 JSON 工具库往往是最通用的解决方案。