有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在具有动态根键时反序列化JSON

我面临着这个问题

{"1234345": [{
   "queue": "XXX",
   "name": "XXXXX",
   "entries": [{
   "points": 54,
   "isInactive": false,
   }],
   "tier": "ASDF"
}]}

但它也可以有这样的形状:

{
 "1234345": [{
  "queue": "XXX",
   "name": "XXXXX",
   "entries": [{
   "points": 54,
   "isInactive": false,
   }],
   "tier": "ASDF"
}],
 "22683144": [{
  "queue": "XXX",
   "name": "XXXXX",
   "entries": [{
   "points": 54,
   "isInactive": false,
   }],
   "tier": "ASDF"
  }]
}

根密钥是一个数组,它可以在每次调用服务时更改。因此,它是动态的

我对这件事很生气。我听说使用动态键的最佳选择是使用地图。但在本例中,如何命名将包含该映射的属性?在这个例子中,作为一个数组,我不知道它是否应该是一个映射,或者如何创建相应的POJO。有什么帮助吗

首先我要做的是为条目创建一个类

public class myEntry {
   public String points;
   public String isInactive;
}

然后是它的容器类

public class myObject {
   public String queue;
   public String name,
   public myEntry[] entries;
   public String tier;
}

但我被困在这里,我不知道如何继续


共 (1) 个答案

  1. # 1 楼答案

    你总是可以用^{}。考虑你在你的问题中张贴的JSON:

    {
      "1234345": [
        {
          "queue": "XXX",
          "name": "XXXXX",
          "entries": [
            {
              "points": 54,
              "isInactive": false
            }
          ],
          "tier": "ASDF"
        }
      ],
      "22683144": [
        {
          "queue": "XXX",
          "name": "XXXXX",
          "entries": [
            {
              "points": 54,
              "isInactive": false
            }
          ],
          "tier": "ASDF"
        }
      ]
    }
    

    使用流行的Java JSON解析器Jackson,可以将其解析为Map<String,Object>对象:

    String json = "{\"1234345\":[{\"queue\":\"XXX\",\"name\":\"XXXXX\",\"entries\":["
                + "{\"points\":54,\"isInactive\":false}],\"tier\":\"ASDF\"}],"
                + "\"22683144\":[{\"queue\":\"XXX\",\"name\":\"XXXXX\",\"entries\":["
                + "{\"points\":54,\"isInactive\":false}],\"tier\":\"ASDF\"}]}";
    
    ObjectMapper mapper = new ObjectMapper();
    Map<String, Object> map = 
        mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
    

    您可以使用POJO代替^{}

    public class Foo {
    
        private String queue;
        private String name;
        private String tier;
        private List<Bar> entries;
    
        // Getters and setters omitted
    }
    
    public class Bar {
    
        private Integer points;
        private Boolean isInactive;
    
        // Getters and setters omitted
    }
    

    对于Jackson,您的代码如下:

    String json = "{\"1234345\":[{\"queue\":\"XXX\",\"name\":\"XXXXX\",\"entries\":["
                + "{\"points\":54,\"isInactive\":false}],\"tier\":\"ASDF\"}],"
                + "\"22683144\":[{\"queue\":\"XXX\",\"name\":\"XXXXX\",\"entries\":["
                + "{\"points\":54,\"isInactive\":false}],\"tier\":\"ASDF\"}]}";
    
    ObjectMapper mapper = new ObjectMapper();
    Map<String, List<Foo>> map = 
        mapper.readValue(json, new TypeReference<Map<String, List<Foo>>>() {});