选择JSON响应字段的数据类型

6
我正在开发一个Java项目,使用Jackson库解析从外部API接收到的JSON响应。响应中的一个字段有时会作为单个对象出现,在某些情况下,它会作为一组对象出现。所以我不确定应该选择哪种数据类型将这个响应映射回Java对象。如何正确地将这两种响应类型映射到Java对象?
在上面提到的可能重复问题中,响应总是列表,但在我的情况下并非如此。因此,我认为这不是上述问题的重复。
以下是我收到的响应:
"configuration": {
    "additionalServices": {
       "type": "Standard DDOS IP Protection"
    },
}

有时候我会得到同样的反应:

"configuration": {
    "additionalServices": [
        {
            "type": "Standard DDOS IP Protection"
        },
        {
            "type": "Remote Management"
        }
    ],
}

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

@JsonIgrnoreProperties(ignoreUnknown = true)
public class Configuration {
    private List<AdditionalServices> additionalServices;
}

@JsonIgrnoreProperties(ignoreUnknown = true)
public class AdditionalServices {
    private String type;
}

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

private List<AdditionalServices> additionalServices;

如果我使用以下声明,则它只会解析第一个响应并为第二个响应抛出异常:
private AdditionalServices additionalServices;

解析数据时出现异常:

无法将START_OBJECT标记反序列化为java.util.ArrayList实例

2个回答

6
您可以通过启用 ACCEPT_SINGLE_VALUE_AS_ARRAY 功能,指示Jackson将单个值包装在数组中:

此功能确定是否可以将非数组(在JSON中)的值强制转换为与Java集合(数组、java.util.Collection)类型兼容。

例如:

objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

只要 additionalServices 是一个集合类型,无论是单值还是数组,反序列化都应该成功。

这解决了问题。非常感谢。 - rakesh

0

在第一个 JSON 传递中,可以这样写:

"configuration": {
   "additionalServices": [{
      "type": "Standard DDOS IP Protection"
    }],
 }

上述提到的JSON响应来自外部API,因此基本上不能像您上面所做的那样更改JSON响应并保留在数组中。 - Ajay

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