gpt4 book ai didi

java - Jackson - 处理多种类型的 JSON

转载 作者:搜寻专家 更新时间:2023-11-01 03:07:34 24 4
gpt4 key购买 nike

假设我有一个如下所示的 JSON 文件:

{
"response" : [
{
"id" : "10",
"period" : "month",
"values" : [
{
"value" : 100,
"date" : "2013-05-10"
}
],
"parent" : "1"
},
{
"id" : "10",
"period" : "day",
"values" : [
{
"value" : {
"foo" : 10,
"bar" : 11,
"etc" : 4
},
"date" : "2013-05-10"
}
],
"parent" : "1"
},{
"id" : "13",
"period" : "year",
"values" : [
{
"value" : {
"info" : 1,
"pages" : 10,
"etc" : 4
},
"date" : "2013-05-10"
}
],
"parent" : "1"
}
]
}

请注意“值”部分可以是单个值,也可以是对象(唯一的)。

我想使用 Jackson ObjectMapper 轻松地将其映射到 POJO。

我目前拥有的:

public class Response
{
List<ResponseEntry> response;
/*getters + setters */

public static class ResponseEntry
{
private String id;
private String period;
private String parent;
private List<Value> values;
/*setters + getters*/

public static class Value
{
private Object value;
private String date;
/*setters+getters*/
}
}
}

要映射响应,我只需指定我想要的文件并告诉 ObjectMapper 映射到“Response”类

ObjectMapper mapper = new ObjectMapper();
Response r = mapper.readValues(json, Response.class);

这行得通,但是除了使用“对象”来保存“值”之外,还有更好的方法吗?由于“值”可以是单个值或对象,所以我很难弄清楚它应该是什么。我确定有一种多态的方式来处理这个问题,但我已经看过但找不到任何有效的方法。我很困,如果有任何帮助,我将不胜感激。

最佳答案

不幸的是,对于您正在处理的 JSON 结构,反序列化它的唯一方法是将 value 属性设为 Object 类型。然而,一旦 JSON 被反序列化,您就可以很容易地判断出 value 是一个对象还是单个值。

请注意,JSON 仅支持五种数据类型:对象(java 中的 Map)、数组、字符串、数字和 boolean 值。在您的情况下,value 很可能是数字或数字映射;那么你有两种可能性要检查。使用快速的 instanceof 比较,您应该能够弄清楚它是什么类型的值。

ObjectMapper mapper = new ObjectMapper();
Response r = mapper.readValues(json, Response.class);
Value val = r.response.get(0).values.get(0);
if (val.value instanceof Map)
; // multiple
else
; // single

关于java - Jackson - 处理多种类型的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227245/

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