数仓中的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 工具库往往是最通用的解决方案。

6万+

被折叠的 条评论
为什么被折叠?



