处理既可以是数组也可以是对象的JSON字段?

8
所以,使用这个API时,我经常遇到包含数组或对象的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>呢?
1个回答

12

解决方案其实非常简单:

objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接