【问题标题】:Choosing datatype for field in JSON response [duplicate]为 JSON 响应中的字段选择数据类型 [重复]
【发布时间】:2019-12-20 19:47:37
【问题描述】:

我正在开发一个 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 的实例

【问题讨论】:

    标签: java json jackson pojo jackson-databind


    【解决方案1】:

    在这样的第一个 JSON 传递中,

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

    【讨论】:

    • 上面提到的JSON响应来自外部API,所以基本上不能像你上面那样改变JSON响应并保留在数组中。
    【解决方案2】:

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

    确定是否可以强制非数组(在 JSON 中)值与 Java 集合(数组、java.util.Collection)类型一起使用的功能。

    例如:

    objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
    

    那么只要additionalServices是一个集合类型,反序列化对于单值或数组应该成功。

    【讨论】:

    • 这解决了这个问题。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 2017-04-04
    • 2011-01-09
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多