当 POJO 类 之一具有哈希图(HashMap<String, String>)时如何将 JSON 读入 POJO 类
How to read a JSON into POJO classes when one of the POJO classes has a hashmap(HashMap<String, String>)
我试图将 .json 文件中的 json 内容加载到 POJO classes 中。其中一个 POJO classes 有一个 HashMap,因此我收到了一个数据绑定异常(据我所知)。有人可以帮我解决吗?
下面是我的 POJO classes:
客户class:
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;
}
}
工作流程Class:
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 class:
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)
使用 @JsonProperty
将您的 JSON 节点 tasks
映射为 b2aTasks
@JsonProperty("tasks")
Map<String, String> b2aTasks= new HashMap<String, String>();
或在 BTA
class 中将 b2aTasks
重命名为 tasks
以映射您的 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");
}
}
使用这种方式取map参数
public void setTasks(HashMap<String, String> map) {
tasks = map;
}
我试图将 .json 文件中的 json 内容加载到 POJO classes 中。其中一个 POJO classes 有一个 HashMap,因此我收到了一个数据绑定异常(据我所知)。有人可以帮我解决吗?
下面是我的 POJO classes:
客户class:
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;
}
}
工作流程Class:
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 class:
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)
使用 @JsonProperty
将您的 JSON 节点 tasks
映射为 b2aTasks
@JsonProperty("tasks")
Map<String, String> b2aTasks= new HashMap<String, String>();
或在 BTA
class 中将 b2aTasks
重命名为 tasks
以映射您的 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");
}
}
使用这种方式取map参数
public void setTasks(HashMap<String, String> map) {
tasks = map;
}