使用Jackson如何将JSON键值对映射为ClassB类型对象
Jackson映射实现方案
核心逻辑是先将动态键值的JSON反序列化为Map结构,再手动组装为目标对象,不需要额外自定义复杂的序列化器,实现成本最低。
1. 补全实体类的必要方法
Jackson反序列化依赖无参构造、getter/setter,另外ClassA要存入Set必须重写equals和hashCode避免逻辑异常:
class ClassA { private String name; private int count; // 必须保留无参构造供Jackson调用 public ClassA() {} // 方便手动组装的全参构造 public ClassA(String name, int count) { this.name = name; this.count = count; } // getter、setter public String getName() { return name; } public void setName(String name) { this.name = name; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } // Set存储必须重写equals和hashCode @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ClassA classA = (ClassA) o; return count == classA.count && name.equals(classA.name); } @Override public int hashCode() { return java.util.Objects.hash(name, count); } }
class ClassB { private Set<ClassA> data; public ClassB() {} public ClassB(Set<ClassA> data) { this.data = data; } // getter、setter public Set<ClassA> getData() { return data; } public void setData(Set<ClassA> data) { this.data = data; } }
2. 反序列化实现代码
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.HashSet; import java.util.Map; import java.util.Set; public class JsonParseDemo { // ObjectMapper线程安全,全局复用即可 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public static void main(String[] args) throws Exception { String inputJson = "{\"pattern\":3,\"graphs\":4}"; // 第一步:反序列化为<String, Integer>类型的Map Map<String, Integer> jsonKeyMap = OBJECT_MAPPER.readValue(inputJson, new TypeReference<Map<String, Integer>>() {}); // 第二步:遍历Map组装ClassA集合 Set<ClassA> classASet = new HashSet<>(); for (Map.Entry<String, Integer> entry : jsonKeyMap.entrySet()) { classASet.add(new ClassA(entry.getKey(), entry.getValue())); } // 第三步:封装为ClassB对象 ClassB result = new ClassB(classASet); // 测试输出验证结果 System.out.println(OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(result)); } }
3. 验证输出
执行后打印的序列化结果如下,符合预期:
{ "data" : [ { "name" : "pattern", "count" : 3 }, { "name" : "graphs", "count" : 4 } ] }
注意事项
- 如果项目用了Lombok,可以直接给实体类加
@Data注解,自动生成所有需要的构造器、getter/setter、equals、hashCode方法 - 不要每次序列化/反序列化都新建
ObjectMapper,会造成不必要的性能损耗
内容的提问来源于stack exchange,提问作者H.Amos
相关产品推荐
相关产品推荐

