数仓中的JSON串困扰了我,格式化Object转为 List 到底有多坑

数仓中的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 是某种集合类型(如 ArrayListHashSet),但类型未知,可将其转换为 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

如果 ObjectList<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; // 使用通配符处理未知泛型

注意事项

  1. 类型安全:确保 Object 的实际类型和目标 List 类型一致。
  2. 避免强制转换异常:使用 instanceof 或 JSON 工具类更安全。
  3. Null 检查:转换前确保 Object 不为 null,或者使用默认值。

根据实际需求选择适合的方式。对于复杂类型的 Object,使用 JSON 工具库往往是最通用的解决方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一周一志程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值