所以,使用这个API时,我经常遇到包含数组或对象的JSON,并且不确定如何正确处理。发生的情况是,我的JSON中有一个数组,如果没有条目,则为空数组;如果有多个条目,则为对象数组;当只有一个条目时,实际上不是一个数组,而是一个对象。以下是一个例子,以使事情更清晰:
现在,如果情况不是这样的,而第二个例子看起来像这样:
但是这样做行不通,因为在json中应该是
{
"what": "kittens",
"why": "I don't meow",
"kittens": []
}
一:
{
"what": "kittens",
"why": "I don't meow",
"kittens": {
"name": "Ser Pounce",
"gender": "male"
}
}
许多:
{
"what": "kittens",
"why": "I don't meow",
"kittens": [
{
"name": "Ser Pounce",
"gender": "male"
},
{
"name": "Mr. Snuffles",
"gender": "male"
}
]
}
现在,如果情况不是这样的,而第二个例子看起来像这样:
{
"what": "kittens",
"why": "I don't meow",
"kittens": [
{
"name": "Ser Pounce",
"gender": "male"
}
]
}
我只需要使用一个普通Java对象(POJO)
public class Kittens
{
public String what;
public String why;
public List<Kitten> kittens;
public static class Kitten
{
public String name;
public String gender;
}
}
然后按照标准方式反序列化所有内容:
Kittens kittens = objectMapper.readValue(good_kitten, Kittens.class);
因此,另一种选择是使用树模型并手动执行大量类型检查(例如使用JsonNode.isArray()
等)。
然而,这不是可行的,因为会有很多开销,不够优雅,而且我提到还存在嵌套的情况:
{
"what": "kittens",
"why": "I don't meow",
"kittens": [
{
"name": "Ser Pounce",
"gender": "male",
"kittens": []
},
{
"name": "Mr. Snuffles",
"gender": "male",
"kittens": {
"name": "Waffles",
"gender": "female",
"kittens": [
{
"name": "Mittens",
"gender": "male",
"kittens": []
},
{
"name": "Winston",
"gender": "male",
"kittens": {
"name": "Fiona",
"gender": "female",
"kittens": []
}
}
]
}
}
]
}
现在我真的很想定义一个如下所示的模型,并完成它。
public class NestedKittens
{
public String what;
public String why;
public List<Kitten> kittens;
public static class Kitten
{
public String name;
public String gender;
public List<Kitten> kittens;
}
}
但是这样做行不通,因为在json中应该是
List<Kitten>
而不是普通的Kitten对象。
那么,是否有任何注解或配置可用,使得jackson在需要时自动将Kitten
转换为List<Kitten>
呢?