Как динамически отобразить массив значений ключей JSON на подобъект, используя Джексона? - PullRequest
0 голосов
/ 01 февраля 2019

Скажем, у нас есть структура 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;
    }
}

Исключение, которое мы в настоящее время получаем:

1 Ответ

0 голосов
/ 01 февраля 2019

Соответствует Message POJO выше JSON в неправильном формате, я сделал пару изменений 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;
  ....
  }
...