Java 拥有动态根键时如何反序列化JSON
我面临着这个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
{"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的变量,该值将在每次调用中更改。