Десериализация с использованием Джексона Джсона, где один из ключей является динамическим - PullRequest
0 голосов
/ 10 октября 2018

Я довольно новичок в Джексоне.Я пытаюсь сопоставить следующий json с POJO, используя Джексона для десериализации.

 {
  "data": [
    {
      "customerName": "abc",
      "varaible_Key1": { 
        "p1": "text data",
        "p2": "textarea data",
         ........
      }
    },
   {
      "customerName": "bbc",
      "varaible_Key2": {
        "p1": "text",
        "p2": "textarea"
        ...... 
      }
    },
   {
      "customerName": "xyz",
      "varaible_Key3": {
        "p1": "xyz text",
        "p2": "xyz textarea"
        ...... 
      }
    }
   ///////more customername / variable_keys
  ]
}

Проблема, с которой я сталкиваюсь, связана с динамическими / переменными ключами в json.

Я пытался использовать@JsonAnySetter в POJO, как показано ниже.

public class Foo {

    @JsonProperty("customerName")
    private String name;

    private Map<String, DataObject> properties;

    @JsonAnyGetter
    public Map<String, DataObject> getProperties() {
        return properties;
    }

    @JsonAnySetter
    public void add(String key, DataObject value) {
        properties.put(key, value);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    } 
}

, где DataObject содержит поля, такие как p1, p2 и т. Д.

public class DataObject {

    @JsonProperty("p1")
    private String firstValue;

    @JsonProperty("p2")
    private String secondValue;

    @JsonProperty("p3")
    private String thirdValue;

    @JsonProperty("p4")
    private String fourthValue;

    public String getFirstValue() {
        return firstValue;
    }

    public void setFirstValue(String firstValue) {
        this.firstValue = firstValue;
    }

    public String getSecondValue() {
        return secondValue;
    }

    public void setSecondValue(String secondValue) {
        this.secondValue = secondValue;
    }

    public String getThirdValue() {
        return thirdValue;
    }

    public void setThirdValue(String thirdValue) {
        this.thirdValue = thirdValue;
    }

    public String getFourthValue() {
        return fourthValue;
    }

    public void setFourthValue(String fourthValue) {
        this.fourthValue = fourthValue;
    }
}

Я получаю приведенную ниже ошибку.Любая помощь по этому вопросу приветствуется.

com.fasterxml.jackson.databind.JsonMappingException: N / A (через цепочку ссылок: com.epic.customer.dto.DataField ["data"] ->java.util.ArrayList [0] -> com.epic.customer.dto.Foo ["varaible_Key1"]) в com.fasterxml.jackson.databind.deser.SettableAnyProperty._throwAsIOE (SettableAnyProperty.java:214) в com.fasterxml..jackson..handleUnknownVanilla (BeanDeserializerBase.java:1539) при com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize (BeanDeserializer.java:293) в com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize (BeanDeserializer.java:151) в com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize (CollectionDeserializer.java:285) в com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize (CollectionDeserializer.java:244) на com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize (CollectionDeserializer.java:27) на com.fasterxml.jackson.databind.deser.impl.Java: 151) в com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose (ObjectMapper.java:4001)

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Я думаю, вам нужно дать подсказку о типе объекта, который вы хотите вернуть:

ObjectMapper mapper = new ObjectMapper();
Map<String, DataObject>  test = mapper.readValue("Insert Data in here", mapper.getTypeFactory().constructMapLikeType(HashMap.class, String.class, DataObject.class));
0 голосов
/ 10 октября 2018

Вам просто нужно создать 2 сеттера для определенного свойства:

class Foo {

    private DataObject dataObject;

    public DataObject getDataObject() {
        return dataObject;
    }

    public void setVaraible_Key1(DataObject dataObject) {
        this.dataObject = dataObject;
    }

    public void setVaraible_Key2(DataObject dataObject) {
        this.dataObject = dataObject;
    }
}

Дальнейшее использование относится здесь .

...