Сопоставить динамические данные JSON с классом pojo в Java?

Я создаю грубую форму, в которой я создаю и потребляю данные Json.

Проблема: данные Json, которые я создаю, очень динамичны. Поэтому я не знаю, как сопоставить его с моим классом pojo.

Что я пробовал

1) Using jackson library, I created structure of my json data and 
tried mapping with it. It failed as in data "**Keys**" are dynamic so mapping failed.
2) I searched and found JsonNode provided by Jackson, problem with 
this is my json structure has key:[{},{}] structure like this 
**key-->array of objects**, so I tried parsing it with json node but failed.

Мои данные Json

Тип 1

{
  "city_master": [
    {
      "citycode": [
        "100",
        "1130385"
      ]
    },
    {
      "cityname": [
        "London",
        "1130383"
      ]
    },
    {
      "statecode": [
        "512",
        "1130382"
      ]
    }
  ]
}

Проблема со структурой заключается в том, что key = "city_master" или любой ключ в этом формате, например ("citycode", "cityname" и т. д.), является динамическим, поэтому не может создать сопоставление pojo для этого класса.

Затем я попытался исправить внешний ключ как root, а синтаксический анализ - как Json Node, как

Тип 2

{
  "root": [
    {
      "citycode": [
        "100",
        "1130385"
      ]
    },
    {
      "cityname": [
        "London",
        "1130383"
      ]
    },
    {
      "statecode": [
        "512",
        "1130382"
      ]
    }
  ]
}

В этой структуре я теряю значение ключа, но могу хранить его в другом месте.

С JsonNode (Type-2) я пробовал это

String jsonString = tdObj.getTempData(); // return's Json String
TempDataTblPojo obj = new ObjectMapper().readValue(jsonString, TempDataTblPojo.class);
JsonNode jsonNode = obj.getRoot();
System.out.println("Name = " + jsonNode);

Этот класс TempDataTblPojo

public class TempDataTblPojo {

    private JsonNode  root;

    public JsonNode getRoot() {
        return root;
    }

    public void setRoot(JsonNode root) {
        this.root = root;
    }
}

Он печатает это

Name = [{"citycode":["100","1130385"]},{"cityname":["London","1130383"]},{"statecode":["512","1130382"]}]

Теперь, как разобрать этот JsonNode, чтобы получить все эти ключи-значения? Или есть эффективное или гораздо более чистое решение, я буду рад принять.


person John    schedule 19.06.2020    source источник


Ответы (1)


Может быть, это поможет вам.

class Pojo {

    private List<PojoItem> root;

    public List<PojoItem> getRoot() {
        return root;
    }

    public void setRoot(List<PojoItem> root) {
        this.root = root;
    }
}

class PojoItem {

    private Map<String, List<String>> items = new HashMap<>();

    public Map<String, List<String>> getItems() {
        return items;
    }

    @JsonAnySetter
    public void setItem(String key, List<String> values) {
        this.items.put(key, values);
    }
}

И тогда вы можете получить его из json, используя это:

Pojo result = objectMapper.readValue(json, Pojo.class);
person matejko219    schedule 19.06.2020
comment
Да, это сработало. Спасибо!. Однако для анализа объекта результата я применяю вложенные циклы for. Что снижает эффективность кода. - person John; 19.06.2020