java - 使用杰克逊反序列化可以是对象列表或对象的属性
问题描述
我的库正在调用一个 API,该 API 可以返回以下任一 JSON 结构 -
{
"key_is_same" : {
"inner" : "val"
}
}
-或者-
{
"key_is_same" : [{
"inner" : "val1"
},
{
"inner" : "val2"
}
]
}
Jakson 中是否有任何注释可以处理此问题并将其反序列化为相应的类型
解决方案
看起来您正在寻找ACCEPT_SINGLE_VALUE_AS_ARRAY
反序列化功能。
确定是否可以接受强制非数组(在 JSON 中)值以使用 Java 集合(数组,
java.util.Collection
)类型的功能。如果启用,集合反序列化器将尝试处理非数组值,就好像它们具有“隐式”围绕 JSON 数组一样。此功能旨在用于兼容性/互操作性的原因,与在数组中只有一个元素的情况下省略 JSON 数组的包(例如 XML 到 JSON 转换器)一起使用。默认情况下禁用该功能。
它可以在以下任一方式启用ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
或通过@JsonFormat
注释:
@JsonFormat(with = Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<Foo> oneOrMany;
出于说明目的,请考虑以下 JSON 文档:
{
"oneOrMany": [
{
"value": "one"
},
{
"value": "two"
}
]
}
{
"oneOrMany": {
"value": "one"
}
}
它可以反序列化为以下类:
@Data
public class Foo {
private List<Bar> oneOrMany;
}
@Data
public class Bar {
private String value;
}
ObjectMapper
只需确保在您或您的字段中启用了该功能即可使用@JsonFormat(with = Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
.
如果您正在寻找序列化的等效功能,请参阅WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED
.
推荐阅读
- php - Laravel - 是否可以对一组属性使用验证规则?
- javascript - django使用模板视图和ajax
- flutter - 通知孩子在父母 onTap 的某个地方发生了
- javascript - 从全局范围内的函数访问局部变量
- c# - WPF:如何防止滚动条覆盖列表类型视图中的标题
- vbscript - 用于 ODBC 驱动程序的 Microsoft OLEDB 提供程序错误“80004005”
- ubuntu - Ubuntu 18.04 上的 HDFview
- javascript - 使用快递从搜索表单重定向?
- c - 声明和定义 C Lang
- python - 使用python将csv数据读入与csv文件相同的列