我正在尝试将一些JSON映射到pojo中。我已经看到了如何在实际数据中使用信息来实现这一点,但我的情况是--我没有任何东西可以识别数据的不同之处,但我确实知道这个列表是由什么组成的。在下面的例子中,我可以得到囚犯或建筑物的列表,但在这种情况下,我知道我得到了囚犯的列表。
下面给我的是JSON (我知道嵌套的数据很奇怪,但是我被赋予了JSON,我无法控制它)。
{
"data": [{
"data": {
"create_date": "2015-09-30",
"building": "12",
"dob": "2/11/1965",
"gender": "M",
"location": {
"zip": "10459"
},
"name": {
"first": "James",
"last": "Bond"
},
"id": "45"
},
"uri": "/prisoner/45"
}, {
"data": {
"create_date": "2015-09-27",
"building": "12",
"dob": "12/15/1985",
"gender": "M",
"location": {
"zip": "10459"
},
"name": {
"first": "Hans",
"last": "Gruber"
},
"id": "56"
},
"uri": "/prisoner/56"
}],
"totals": {
"total": 2,
"page": 1
},
"links": [{
"uri": "/prisoners?limit=2"
}]
}我有一个数据对象,它包含一个总计对象和一个链接对象。我还有一个包含嵌套数据对象数组的Datum对象的集合(在本例中是一个列表)。Datum对象有一个Thing抽象类和一个Uri字符串。我有一个囚徒和一个建筑类扩展的东西。在上面的JSON中,我知道我得到了一份囚犯名单。
我现在的代码是:
ObjectMapper mapper = new ObjectMapper();
Data data = mapper.readValue(responseJSON.toString(), Data.class);如果我进入Datum并将Thing对象更改为Prisoner对象,它就会完美地工作。我的问题是,我如何使它接受囚徒或建筑,但仍然有抽象的东西类到位,或至少使它可以更通用。我知道我可以做几个基准类,但我相信一定有一个方法有一个基准类。实际上,我可以得到几十种不同的数据,而不仅仅是我的例子中的2种。
发布于 2016-10-24 21:48:10
你的意思是,你知道当你读这个值的时候会是什么类型的东西?因为在这种情况下,您可以参数化数据(即Data<T extends Thing>),并将类型参数传播到Datum,以指定所拥有的东西的子类。然后,当您调用readValue时,您需要告诉Jackson参数化类型,可以静态地这样做:
mapper.readValue(jsonString, new TypeReference<Data<Prisoner>>(){});它可以通过使用从TypeFactory获得的参数化类型来动态地完成。类似于:
mapper.readValue("", mapper.getTypeFactory()
.constructParametricType(Data.class, thingSubclass));https://stackoverflow.com/questions/40227921
复制相似问题