使用fasterXML/Jackson构造方法反序列化复杂JSON的问题
解决Jackson反序列化对象数组的问题
没问题,这事儿很容易解决,只需要调整你的实体类结构和构造方法的参数类型就行,具体操作如下:
1. 创建对应子对象的POJO类
首先,你需要新建一个类来映射JSON中blargs数组里的每个对象(比如{"fooId":888,"barVal":"tacos"}这种结构),我们就叫它FooBarItem:
public class FooBarItem { private Integer fooId; private String barVal; // 使用@JsonCreator配合@JsonProperty指定构造参数对应的JSON字段 @JsonCreator public FooBarItem(@JsonProperty("fooId") Integer fooId, @JsonProperty("barVal") String barVal) { this.fooId = fooId; this.barVal = barVal; } // 可选:添加getter方法方便后续获取属性值 public Integer getFooId() { return fooId; } public String getBarVal() { return barVal; } }
2. 修改原FooBar类的构造方法参数类型
把原来FooBar类中构造方法的List<String>替换成List<FooBarItem>,保持注解配置不变:
public class FooBar { private List<FooBarItem> xyz; @JsonCreator public FooBar(@JsonProperty("blargs") List<FooBarItem> xyz) { this.xyz = xyz; } // 可选:添加getter方法 public List<FooBarItem> getXyz() { return xyz; } }
3. 测试反序列化
现在你就可以用Jackson正常解析新的JSON结构了,示例代码如下:
import com.fasterxml.jackson.databind.ObjectMapper; public class Main { public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); // 你的目标JSON字符串 String json = "{\"blargs\":[{\"fooId\":888,\"barVal\":\"tacos\"},{\"fooId\":999,\"barVal\":\"burritos\"}]}"; FooBar fooBar = objectMapper.readValue(json, FooBar.class); // 遍历验证结果 for (FooBarItem item : fooBar.getXyz()) { System.out.println("fooId: " + item.getFooId() + ", barVal: " + item.getBarVal()); } } }
额外说明
如果你更倾向于使用可变对象,也可以给FooBarItem添加无参构造方法和对应的setter方法,Jackson会自动完成字段映射,不需要@JsonCreator注解——不过用构造方法的方式更符合不可变对象设计的最佳实践,能避免后续意外修改属性值。
内容的提问来源于stack exchange,提问作者russellelbert
相关产品推荐
相关产品推荐

