【问题标题】:Map dynamic JSON data to pojo class in Java?将动态 JSON 数据映射到 Java 中的 pojo 类?
【发布时间】:2020-06-19 10:06:47
【问题描述】:

我正在创建一个生成和使用 Json 数据的 crud 表单。

问题: 我正在生成的 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 as

类型 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,得到所有的key-value?或者是否有有效或更清洁的解决方案,我很乐意接受。

【问题讨论】:

    标签: java json jackson objectmapper


    【解决方案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);
    

    【讨论】:

    • 是的,它奏效了。谢谢!。但是,为了解析结果对象,我已经应用了嵌套的 for 循环。这会降低代码效率。
    猜你喜欢
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2021-08-25
    • 2013-04-16
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多