猿问

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

假设我们有一个如下所示的 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;

}

我们尝试了不同的方法来实现这一点,最初我们尝试将属性设置为private List<MessageAttribute> attributes;但也没有奏效(我们根据另一个答案切换到地图- 不起作用)


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


这就是这个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"])



沧海一幻觉
浏览 143回答 1
1回答

一只名叫tom的猫

对应Message于上述 JSON 的 POJO 格式错误,我做了一些更改attributes应该是List of Map并且列表AnotherObject应该指向 arrayOfStuffpublic class Message {&nbsp;@IsUniqueId&nbsp;private String field1; //&nbsp;private String field2;&nbsp;private String field3;&nbsp;private String field4;&nbsp;private List<AnotherObject> arrayOfStuff;&nbsp; //or you can have List<Map<String,String>> arrayOfStuff&nbsp;@JsonProperty("attributes")&nbsp;private List<LinkedHashMap<String, String>> attributes; // this is list of map objects&nbsp;private List<String> options;&nbsp; ....&nbsp; }
随时随地看视频慕课网APP

相关分类

Java
我要回答