基于Jackson注解实现JSON转POJO:替代自定义反序列化器方案问询
不用自定义反序列化器,纯Jackson注解实现JSON转POJO
当然有更简洁的方案!你完全可以借助Jackson的几个核心注解来实现这个转换,不用编写复杂的自定义反序列化器。下面我来一步步拆解实现思路:
核心思路
你的需求核心是把JSON中root节点下所有以connection为前缀的动态字段,收集到Root类的connections列表中,同时把status字段转换成isAlive布尔值。我们可以用@JsonAnySetter来处理动态字段,配合常规的属性映射注解完成转换。
修改后的POJO类实现
1. 简化POJO类
首先去掉自定义反序列化器的配置,让POJO类回归简洁:
@JsonIgnoreProperties(ignoreUnknown = true) public class POJO { @JsonProperty("root") private Root root; // Getters & Setters public Root getRoot() { return root; } public void setRoot(Root root) { this.root = root; } }
2. 改造Root类
重点在Root类中用注解实现逻辑:
public class Root { private boolean isAlive; private List<Connection> connections = new ArrayList<>(); // 映射JSON中的status字段,并转换为isAlive布尔值 @JsonProperty("status") public void setStatus(String status) { this.isAlive = "UP".equalsIgnoreCase(status); } // 捕获所有未匹配到的属性,筛选出connection前缀的字段加入列表 @JsonAnySetter public void addConnection(String key, Connection connection) { if (key.startsWith("connection")) { this.connections.add(connection); } } // Getters public boolean isAlive() { return isAlive; } public List<Connection> getConnections() { return connections; } }
3. Connection类保持不变
@JsonIgnoreProperties(ignoreUnknown = true) public class Connection { private String status; // Getters & Setters public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } }
原理说明
@JsonAnySetter:这个注解会让Jackson自动把所有没有对应字段/标准setter的属性,传递到标注的方法中。我们在这里判断属性名是否以connection开头,符合条件就添加到connections列表里。- 自定义
setStatus方法:通过@JsonProperty("status")映射JSON中的status字段,在方法内部完成字符串到布尔值的转换,赋值给isAlive。
测试验证
用常规的ObjectMapper反序列化测试:
String json = "{ \"root\": { \"status\": \"UP\", \"connection1\": { \"status\": \"UP\" }, \"connection2\": { \"status\": \"UP\" } } }"; ObjectMapper mapper = new ObjectMapper(); POJO pojo = mapper.readValue(json, POJO.class); System.out.println(pojo.getRoot().isAlive()); // 输出 true System.out.println(pojo.getRoot().getConnections().size()); // 输出 2
如果需要保持connection字段的顺序(和JSON中出现的顺序一致),可以把connections的类型改成LinkedList,Jackson默认会按照JSON属性的顺序传递给@JsonAnySetter方法。
内容的提问来源于stack exchange,提问作者Valentyn Anzhurov
相关产品推荐
相关产品推荐

