Memetakan data JSON dinamis ke kelas pojo di Java?

Saya membuat formulir kasar di mana saya memproduksi dan menggunakan data Json.

Masalah: Data Json yang saya hasilkan sangat dinamis. Jadi saya tidak tahu cara memetakannya ke kelas pojo saya.

Apa yang telah saya coba

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.

Data Json saya

Tipe 1

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

Masalah dengan struktur adalah key = "city_master" atau kunci apa pun dalam format ini misalnya("citycode", "cityname" dll) bersifat dinamis sehingga tidak dapat membuat pojo pemetaan untuk kelas ini.

Kemudian saya mencoba memperbaiki kunci luar sebagai root dan parsingnya sama dengan Json Node

Tipe 2

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

Dalam struktur ini saya kehilangan nilai kunci saya, tetapi saya dapat menyimpannya di tempat lain.

Dengan JsonNode (Tipe-2) saya mencoba ini

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);

Kelas ini TempDataTblPojo

public class TempDataTblPojo {

    private JsonNode  root;

    public JsonNode getRoot() {
        return root;
    }

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

Ini mencetak ini

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

Sekarang bagaimana cara mengurai JsonNode ini, untuk mendapatkan semua nilai kunci ini? Atau adakah solusi yang efisien atau lebih bersih, saya akan dengan senang hati menerimanya.


person John    schedule 19.06.2020    source sumber


Jawaban (1)


Mungkin ini akan membantu Anda.

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);
    }
}

Dan kemudian Anda bisa mendapatkannya dari json menggunakan ini:

Pojo result = objectMapper.readValue(json, Pojo.class);
person matejko219    schedule 19.06.2020
comment
Ya itu berhasil. Terima kasih!. Namun untuk mengurai objek hasil saya telah menerapkan loop for bersarang. Yang menurunkan efisiensi kode. - person John; 19.06.2020