Сопоставить динамические данные c JSON с классом pojo в Java? - PullRequest
1 голос
/ 19 июня 2020

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

Проблема : Json данные, которые я производю, очень динамичны c. Поэтому я не знаю, как сопоставить его с моим классом 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.

My Json Data

Тип 1

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

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

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

Тип 2

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

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

С JsonNode (Тип-2) I пробовал это

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, чтобы получить все эти пары "ключ-значение"? Или есть более эффективное или более чистое решение, я с радостью приму его.

1 Ответ

2 голосов
/ 19 июня 2020

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...