You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:36:02