Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Jackson将键值的JSON数组动态映射到子对象?_Java_Json_Spring Boot_Jackson_Jackson2 - Fatal编程技术网

Java 如何使用Jackson将键值的JSON数组动态映射到子对象?

Java 如何使用Jackson将键值的JSON数组动态映射到子对象?,java,json,spring-boot,jackson,jackson2,Java,Json,Spring Boot,Jackson,Jackson2,假设我们有一个JSON结构,如下所示: { "field1": "val1", "field2": "v2", "f3": "v3", "f4": "v4", "arrayOfStuff": [ { "f5": "v5", .... "f10": "v10" } ], "attributes": [ {"att1": "att1"}, {"att2": "attr2"}, {"att3": "att3"} ], "options": [

假设我们有一个JSON结构,如下所示:

{
 "field1": "val1",
 "field2": "v2",
 "f3": "v3",
 "f4": "v4",
 "arrayOfStuff": [
  {
   "f5": "v5",
   ....
   "f10": "v10"
  }
 ],
 "attributes": [
  {"att1": "att1"},
  {"att2": "attr2"},
  {"att3": "att3"}
 ],
 "options": [
  "ignoreMismatchFile"
 ]
}
我们匹配的java类如下所示:

public class Message {
   @IsUniqueId
   private String field1; //
   private String field2;
   private String field3;
   private String field4;
   private List<AnotherObject> f5;
   @JsonProperty("attributes")
   private LinkedHashMap<String, String> attributes;
   private List<String> options;
   ....
}
protected Message loadSavedMessageAsMessageObject(String path) throws IOException {
    File file = ResourceUtils.getFile(path);
    if (file.exists()) {
        ObjectMapper mapper = this.getObjectMapper();
        return mapper.readValue(file, Message.class);
    }

    return null;
}
我们尝试了不同的方法来实现这一点,最初我们尝试将属性设置为
私有列表属性但这也不起作用(我们切换到基于-不起作用的地图)

我们的目标是让属性保持一个动态的,而不是硬编码的属性列表

这就是
MessageAttribute
类的外观:

public class MessageAttribute {
    private String key;
    private String value;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
我们目前得到的例外情况是:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.LinkedHashMap` out of START_OBJECT token
at [Source: (File); line: 32, column: 3] (through reference chain: com.org.Message["attributes"])

与上述JSON对应的
消息
POJO格式错误,我对
属性
应该是
映射列表
,而
另一个对象的列表
应该指向
arrayOfStuff

public class Message {
 @IsUniqueId
 private String field1; //
 private String field2;
 private String field3;
 private String field4;
 private List<AnotherObject> arrayOfStuff;  //or you can have List<Map<String,String>> arrayOfStuff
 @JsonProperty("attributes")
 private List<LinkedHashMap<String, String>> attributes; // this is list of map objects
 private List<String> options;
  ....
  }
公共类消息{
@是唯一的
私有字符串字段1//
私有字符串字段2;
私有字符串字段3;
私有字符串字段4;
private List arrayOfStuff;//也可以使用List arrayOfStuff
@JsonProperty(“属性”)
私有列表属性;//这是映射对象的列表
私人名单选择;
....
}

您是否考虑过编写自定义反序列化程序的想法没有走那么远,幸运的是不再需要:)谢谢!有了这个答案,我们发现JSON是错误的,所以没有将属性双重包装,而是将属性更改为具有许多动态字段的单个对象,works:)