Java 拥有动态根键时如何反序列化JSON

Java 拥有动态根键时如何反序列化JSON,java,json,dynamic,Java,Json,Dynamic,我面临着这个json的麻烦 {"1234345": [{ "queue": "XXX", "name": "XXXXX", "entries": [{ "points": 54, "isInactive": false, }], "tier": "ASDF" }]} 但它也可以有这样的形状: { "1234345": [{ "queue": "XXX", "name": "XXXXX", "entries": [{ "point

我面临着这个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;
}
但是我被困在这里了,我不知道如何继续。

你总是可以用一个。考虑你在你的问题中张贴的JSON:

{
"1234345": [
{
“队列”:“XXX”,
“名称”:“XXXXX”,
“条目”:[
{
“分数”:54分,
“isInactive”:false
}
],
“层”:“ASDF”
}
],
"22683144": [
{
“队列”:“XXX”,
“名称”:“XXXXX”,
“条目”:[
{
“分数”:54分,
“isInactive”:false
}
],
“层”:“ASDF”
}
]
}
使用流行的Java JSON解析器Jackson,可以将其解析为
Map
对象:

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=新的ObjectMapper();
地图=
readValue(json,newTypeReference(){});
而不是,您可以使用POJO:

公共类Foo{
私有字符串队列;
私有字符串名称;
私有字符串层;
私人名单条目;
//省略了getter和setter
}
公共类栏{
私有整数点;
私有布尔是主动的;
//省略了getter和setter
}
对于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=新的ObjectMapper();
地图=
readValue(json,newTypeReference(){});

Ick。有人真的搞砸了他们的JSON设计。好吧,你能举个例子说明你打算如何使用输出吗?虽然我大力提倡强静态类型,但在这种情况下,Groovy动态遍历可能是最不痛苦的选择。“1234345”、“22683144”这些内容应该存储在一个数组中。我同意@chrylis的说法,这个JSON设计不好。根数不重要,我可以避免使用它。我真的不需要那个号码。也许我应该重做json删除那些键并正确读取。是的,设计很糟糕,我真的不知道他们为什么这样做。是的,但是我该如何命名这个数组。它不会与任何定义的属性匹配。我无法创建名为1234345的变量,该值将在每次调用中更改。