如何动态映射使用杰克逊子对象键值的JSON阵列?

时间:2019-02-01 19:41:16

标签: java json spring-boot jackson jackson2

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

www

我们匹配的java类如下:

<naming-strategy-map />

解析代码如下:

{
 "field1": "val1",
 "field2": "v2",
 "f3": "v3",
 "f4": "v4",
 "arrayOfStuff": [
  {
   "f5": "v5",
   ....
   "f10": "v10"
  }
 ],
 "attributes": [
  {"att1": "att1"},
  {"att2": "attr2"},
  {"att3": "att3"}
 ],
 "options": [
  "ignoreMismatchFile"
 ]
}

我们尝试了不同的方法来实现此目的,最初我们尝试将属性设置为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; .... } ,但也没有用(我们基于Another answer切换到Map-不起作用)

我们的目标是保持属性的动态的,不是硬编码的属性列表。

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; } 类的外观如下:

private List<MessageAttribute> attributes;

我们目前得到的例外是:

MessageAttribute

1 个答案:

答案 0 :(得分:2)

与以上JSON对应的Message POJO格式错误,我做了几处更改attributes应该是List of Map,并且AnotherObject的列表应该指向 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;
  ....
  }