求openCSV对json字段下一些key的映射方法?
解析csv文件,提取某些字段特别对于json字段的解析,提取某些key,并生成新的csv文件
openCSV sql
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- Maka Baka+ + 2024-02-20 18:42关注
从您提供的代码和图片中可以看出,您正在尝试使用openCSV库将CSV文件中的数据映射到Java对象中。对于CSV文件中包含的JSON字段,您希望能够解析该JSON字段,并且从中抽取特定的键值对,并将它们作为独立的字段写入新的CSV文件。
在您的
Oder
类中,您定义了id
、type
、sort
和age
作为属性,但根据您的最后一张图片,JSON数据似乎也包含name
键。如果您想进一步提取JSON中的name
字段,您需要在Oder
类中添加一个对应的属性。首先,您需要确保您的
Oder
类可以处理这种情况。例如,您可能需要一个新的字段来存储JSON字段中的name
值:@Data public class Oder { private String id; private String type; private String sort; private Integer age; private String name; // 新增字段 }
然后,您需要一种方法来解析CSV中的JSON列,并为该列中的每个键设置正确的字段。您可以使用一个自定义的转换器来解析JSON并设置
Oder
对象的属性。这里有一个简化的示例,其中CustomBinding
类是您需要实现的自定义类:import com.opencsv.bean.AbstractBeanField; import com.opencsv.exceptions.CsvConstraintViolationException; import com.opencsv.exceptions.CsvDataTypeMismatchException; import org.json.JSONObject; public class CustomBinding extends AbstractBeanField<Oder, String> { @Override protected Object convert(String value) throws CsvDataTypeMismatchException, CsvConstraintViolationException { JSONObject jsonObject = new JSONObject(value); Oder order = new Oder(); order.setId(jsonObject.optString("id")); order.setType(jsonObject.optString("type")); order.setSort(jsonObject.optString("sort")); order.setAge(jsonObject.optInt("age")); order.setName(jsonObject.optString("name")); // 解析并设置name属性 return order; } }
接下来,您需要在您的映射策略中指定这个自定义的转换器。例如,如果您的JSON数据位于名为
jsonData
的CSV列中,您的映射策略可能看起来像这样:ColumnPositionMappingStrategy<Oder> strategy = new ColumnPositionMappingStrategy<>(); strategy.setType(Oder.class); String[] columns = new String[]{"id", "type", "sort", "age", "jsonData"}; // CSV的列名 strategy.setColumnMapping(columns); strategy.setType(Oder.class);
在CSV读取过程中,对于
jsonData
列,您需要使用自定义的转换器来解析它。您可以通过注册转换器的方式来做:CsvToBeanBuilder<Oder> beanBuilder = new CsvToBeanBuilder<>(reader); beanBuilder.withType(Oder.class); beanBuilder.withMappingStrategy(strategy); beanBuilder.withConverter("jsonData", new CustomBinding()); // 注册转换器 List<Oder> orders = beanBuilder.build().parse();
最后,您可以将解析出的
List<Oder>
对象写入新的CSV文件中,这个步骤您似乎已经掌握了。请注意,您需要根据您实际的情况调整代码,我的代码只是提供一个大致的方向。您可能需要加入异常处理,以及针对JSON结构的特定细节进行调整。您可能还需要引入JSON处理库如
org.json
或com.fasterxml.jackson.databind
,如果您还没有这样做的话。
部分参考于gpt3.5解决 无用评论 打赏 举报
悬赏问题
- ¥15 公交车和无人机协同运输
- ¥15 stm32代码移植没反应
- ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
- ¥100 连续两帧图像高速减法
- ¥15 组策略中的计算机配置策略无法下发
- ¥15 如何绘制动力学系统的相图
- ¥15 对接wps接口实现获取元数据
- ¥20 给自己本科IT专业毕业的妹m找个实习工作
- ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
- ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)