在JSON响应中为字段选择数据类型

rak*_*esh 6 java json pojo jackson jackson-databind

我正在研究一个Java项目,该项目使用Jackson库解析从外部API接收到的JSON响应。响应中的字段之一有时作为单个对象出现,在某些情况下,它作为对象数组出现。因此,我不确定应该选择哪种数据类型将此响应映射回Java对象。如何将两种响应类型正确映射到Java对象?

在上述可能的重复项中,响应始终是一个列表,但在我看来,它不是。所以我不认为它是上述问题的重复。

以下是我收到的回复:

"configuration": {
    "additionalServices": {
       "type": "Standard DDOS IP Protection"
    },
}
Run Code Online (Sandbox Code Playgroud)

有时这就是我收到相同回复的方式:

"configuration": {
    "additionalServices": [
        {
            "type": "Standard DDOS IP Protection"
        },
        {
            "type": "Remote Management"
        }
    ],
}
Run Code Online (Sandbox Code Playgroud)

这是我的Java映射现在的样子:

"configuration": {
    "additionalServices": {
       "type": "Standard DDOS IP Protection"
    },
}
Run Code Online (Sandbox Code Playgroud)
"configuration": {
    "additionalServices": [
        {
            "type": "Standard DDOS IP Protection"
        },
        {
            "type": "Remote Management"
        }
    ],
}
Run Code Online (Sandbox Code Playgroud)

如果我使用以下声明,则它将仅解析数组输出,并为第一个响应抛出异常:

@JsonIgrnoreProperties(ignoreUnknown = true)
public class Configuration {
    private List<AdditionalServices> additionalServices;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用以下声明,则它将仅解析第一个响应,并为第二个响应引发异常:

@JsonIgrnoreProperties(ignoreUnknown = true)
public class AdditionalServices {
    private String type;
}
Run Code Online (Sandbox Code Playgroud)

解析数据的异常:

无法从START_OBJECT令牌中反序列化java.util.ArrayList的实例

Jon*_*han 6

您可以通过启用以下ACCEPT_SINGLE_VALUE_AS_ARRAY功能来指示Jackson来“包装”数组中的单个值:

确定强制将非数组(JSON)值强制用于Java集合(数组,java.util.Collection)类型的功能。

例如:

objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
Run Code Online (Sandbox Code Playgroud)

然后,只要additionalServices是集合类型,反序列化就应该对单值或数组成功。