gpt4 book ai didi

java - 如何使用抽象类将 JSON 数据数组反序列化为 POJO?

转载 作者:行者123 更新时间:2023-11-30 06:51:22 26 4
gpt4 key购买 nike

我正在尝试将一些 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"
}]
}

我有一个Data 对象,其中包含一个总计对象和一个链接对象。我还有一个 Datum 对象的集合(在本例中为列表),其中包含嵌套的 Data 对象数组。 Datum 对象有一个 Thing 抽象类和一个 Uri 字符串。我有一个 Prisoner 和一个扩展 ThingBuilding 类。在上面的 JSON 中,我知道我得到了一份囚犯名单。

我当前的代码:

ObjectMapper mapper = new ObjectMapper();
Data data = mapper.readValue(responseJSON.toString(), Data.class);

如果我进入 Datum 并将 Thing 对象更改为 Prisoner 对象,它将完美运行。我的问题是如何让它接受 PrisonerBuilding 但仍然有抽象的 Thing 类,或者至少让它如此可以更通用。我知道我可以制作多个 Datum 类,但我相信一定有办法拥有 1 个 Datum 类。实际上,我可以获得数十种不同的数据可能性,而不仅仅是我示例中的 2 种。

最佳答案

您的意思是,您知道读取值时 Thing 的类型是什么?因为在那种情况下,您可以参数化 Data(即 Data<T extends Thing> ),并将类型参数传播到 Datum 以指定您拥有的 Thing 的子类。然后你需要在调用 readValue 时告诉 Jackson 参数化类型,这可以像这样静态地完成:

mapper.readValue(jsonString, new TypeReference<Data<Prisoner>>(){});

这可以通过使用 ObjectMapper 中可用的 TypeFactory 构造参数化类型来动态完成。像这样的东西:

mapper.readValue("", mapper.getTypeFactory()
.constructParametricType(Data.class, thingSubclass));

关于java - 如何使用抽象类将 JSON 数据数组反序列化为 POJO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40227921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com