为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2022-06-04 09:40:40
假设我们有一个如下所示的 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 tokenat [Source: (File); line: 32, column: 3] (through reference chain: com.org.Message["attributes"])
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

对应Message于上述 JSON 的 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;

  ....

  }


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号