使用Jackson从JSON提取数组并转换为JSON格式适配POJO
我明白你现在遇到的问题了——当你把整个JSON转成Map后,提取出来的ROU_DATA数组变成了Java集合的toString格式,没法直接用你的ROU POJO解析,而且手动替换字符串的方式既麻烦又容易出错。其实用Jackson完全不用这么绕,有两种更优雅可靠的解决办法:
方案一:创建顶层POJO类直接解析整个JSON
这种方式最规范,把整个JSON结构对应到Java类上,彻底避免手动处理Map的麻烦。
首先创建一个顶层类来匹配整个JSON结构:
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; public class Root { @JsonProperty("password") private String password; @JsonProperty("ROU_DATA") private List<ROU> rouData; // Getters and Setters public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List<ROU> getRouData() { return rouData; } public void setRouData(List<ROU> rouData) { this.rouData = rouData; } }
然后解析代码就非常简洁:
ObjectMapper mapper = new ObjectMapper(); String json = "{ \"password\":\"des123\",\"ROU_DATA\":[{\"FORM_RECEIVING_TIME\":\"12:00:00\",\"REMARKS\":\"Redemption of Unit\"}, {\"FORM_RECEIVING_TIME\":\"13:00:00\",\"REMARKS\":\"sALE of Unit\"}] }"; // 直接将JSON解析为Root对象 Root root = mapper.readValue(json, Root.class); // 遍历ROU_DATA数组 for (ROU rou : root.getRouData()) { System.out.println("接收时间:" + rou.getFormdate()); System.out.println("备注:" + rou.getRemarks()); }
方案二:不创建顶层类,用JsonNode提取数组
如果不想额外创建顶层类,可以先把JSON解析成JsonNode,定位到ROU_DATA节点后再转成ROU数组:
ObjectMapper mapper = new ObjectMapper(); String json = "{ \"password\":\"des123\",\"ROU_DATA\":[{\"FORM_RECEIVING_TIME\":\"12:00:00\",\"REMARKS\":\"Redemption of Unit\"}, {\"FORM_RECEIVING_TIME\":\"13:00:00\",\"REMARKS\":\"sALE of Unit\"}] }"; // 解析JSON为JsonNode节点树 JsonNode rootNode = mapper.readTree(json); // 获取ROU_DATA对应的子节点 JsonNode rouDataNode = rootNode.get("ROU_DATA"); // 将JsonNode直接转换为ROU数组 ROU[] rouArray = mapper.treeToValue(rouDataNode, ROU[].class); // 遍历数组处理数据 for (ROU rou : rouArray) { System.out.println("接收时间:" + rou.getFormdate()); System.out.println("备注:" + rou.getRemarks()); }
为什么你原来的方法会出问题?
你原来的代码中,map.get("ROU_DATA")返回的是List<Map<String, Object>>,调用toString()后得到的是Java集合的默认字符串格式(比如[{FORM_RECEIVING_TIME=12:00:00, REMARKS=Redemption of Unit}, ...]),这不是标准JSON格式:JSON的键必须带双引号,且键值对用冒号分隔,而不是等号。手动替换符号的方式非常脆弱,如果值里包含=或者[]这类字符,就会破坏JSON结构,导致解析失败。
用上面两种Jackson原生的方法,就能完美避开这些问题,代码更简洁、可读性更强,也更可靠。
内容的提问来源于stack exchange,提问作者Jawad-Dev
相关产品推荐
相关产品推荐

