แมปข้อมูล 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
ใช่มันได้ผล ขอบคุณ!. อย่างไรก็ตามในการแยกวิเคราะห์วัตถุผลลัพธ์ฉันได้ใช้การซ้อนสำหรับการวนซ้ำ ซึ่งทำให้ประสิทธิภาพของโค้ดลดลง - person John; 19.06.2020