java - 为 JSON 响应中的字段选择数据类型

标签 java json jackson pojo jackson-databind

我正在开发一个 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;

解析数据异常:

Cannot deserialize instance of java.util.ArrayList out of START_OBJECT token

最佳答案

您可以通过启用 ACCEPT_SINGLE_VALUE_AS_ARRAY 指示 Jackson 在数组中“包装”单个值特点:

Feature that determines whether it is acceptable to coerce non-array (in JSON) values to work with Java collection (arrays, java.util.Collection) types.

例如:

objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

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

关于java - 为 JSON 响应中的字段选择数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57491539/

相关文章:

java - Chrome 放弃了 Java 支持

java - 获取服务器地址和应用程序名称

java - Intellij + Apache Math 3.3 给出 NoClassDefFounderror

java - spring-boot JPA无限循环多对多

hibernate - MappingJackson2HttpMessageConverter 找不到类型的(映射)键反序列化器

java - 测量创建和销毁一个简单对象的时间

javascript - 如何将现有数据读入 Quill JS

ios - 如何从使用 JSON (Swift) 检索的存储的 Int/String 中删除方括号 [ ]?

javascript - 为什么我在我的表中看不到我的 JSON 数据?

json - Jackson 2 错误地序列化 Java java.nio.file.Path