),java,jackson,jackson-databind"/>

首页 > 解决方案 > 当 POJO 类之一具有 hashmap(HashMap) 时如何将 JSON 读入 POJO 类)

问题描述

我试图将 .json 文件中的 json 内容加载到 POJO 类中。其中一个 POJO 类有一个 HashMap,因此我收到了一个数据绑定异常(据我所知)。有人可以帮我解决吗?

以下是我的 POJO 课程:

客户等级:

public class Customer {

private String name;
private Workflow workflow;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Workflow getWorkflow() {
        return workflow;
    }

    public void setWorkflow(Workflow workflow) {
        this.workflow = workflow;
    }

}

工作流类:

public class Workflow {

    private int loaCount;
    private BTA bTA;

    public int getLoaCount() {
        return loaCount;
    }

    public void setLoaCount(int loaCount) {
        this.loaCount = loaCount;
    }

    public BTA getbTA() {
        return bTA;
    }

    public void setbTA(BTA bTA) {
        this.bTA = bTA;
    }

}

BTA类:

public class BTA {

    HashMap<String, String> tasks = new HashMap<String, String>();

    public BTA() {
        // do nothing
    }

    public BTA(int loaCount) {
        setTasks(loaCount);
    }

    private void setTasks(int loaCount) {
        for (int index = 0; index < loaCount; index++) {
            tasks.put("Task " + index, "Not Started");
        }
    }

    public HashMap<String, String> getTasks() {
        return tasks;
    }
}

从文件中读取 JSON 的代码:

public class JsonReaderWriter {

    public static void main(String[] args) {
        reader();
    }

    public static void reader() {
        ObjectMapper mapper = new ObjectMapper();
        try {
            Customer customer = mapper.readValue(Paths.get(System.getProperty("user.dir") + "/customer.json").toFile(), Customer.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

JSON文件内容:

{
  "name" : "Santosh",
  "workflow" : {
    "loaCount" : 3,
    "bTA" : {
      "tasks" : {
        "Task 2" : "Not Started",
        "Task 1" : "Not Started",
        "Task 0" : "Not Started"
      }
    }
  }

我看到的异常:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.Integer out of START_OBJECT token
 at [Source: /Users/santosh/eclipse-workspace/RestAssuredTesting/customer.json; line: 6, column: 7] (through reference chain: com.jackson.Customer["workflow"]->com.jackson.Workflow["bTA"]->com.jackson.BTA["tasks"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:575)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseInteger(StdDeserializer.java:332)
    at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:319)
    at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:301)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1988)
    at com.jackson.JsonReaderWriter.reader(JsonReaderWriter.java:39)
    at com.jackson.JsonReaderWriter.main(JsonReaderWriter.java:11)

标签: javajacksonjackson-databind

解决方案


用于@JsonProperty将您的 JSON 节点映射tasksb2aTasks

@JsonProperty("tasks")
Map<String, String> b2aTasks= new HashMap<String, String>();

或重命名b2aTaskstasksin BTAclass 以映射您的 json

 Map<String, String> tasks = new HashMap<String, String>();

更新: Json 序列化程序使用 setter 方法设置值。您的 setter 方法采用 int 而不是 map 这就是问题所在。

private void setTasks(int loaCount) {
    for (int index = 0; index < loaCount; index++) {
        tasks.put("Task " + index, "Not Started");
    }
}

使用这种方式获取地图参数

public void setTasks(HashMap<String, String> map) {
    tasks = map;
}

推荐阅读