java - 如何在java中将JSON反序列化为类Object
问题描述
我正在使用 Jackson 库将 JSON 转换为 Class Object,但问题是答案何时可以是字符串或数组,例如:
数据抛出一条消息:
{
"status":"OK",
"data": "No results"
}
data 释放一个数组:
{
"status":"OK",
"data":[
{
"a":"190923114052",
"b":"",
"c":"1176225-19"
}
]
}
我的课
public class ReponseWS(){
private String status;
private List<Data> data;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List<Data> getData() {
return data;
}
public void setData(List<Data> data) {
this.data = data;
}
}
当数据以字符串而不是数组的形式出现时
错误:无法读取 JSON:无法将 java.util.ArrayList 的实例反序列化出 VALUE_STRING 令牌
希望对我有帮助,非常感谢。
解决方案
您可以注册com.fasterxml.jackson.databind.deser.DeserializationProblemHandler
并实现handleUnexpectedToken
方法。如果预期类型是ArrayList
并且JsonToken
是VALUE_STRING
你总是可以返回新ArrayList
对象:
ObjectMapper mapper = JsonMapper.builder()
.addHandler(new DeserializationProblemHandler() {
@Override
public Object handleUnexpectedToken(DeserializationContext ctxt, JavaType targetType, JsonToken t, JsonParser p, String failureMsg) throws IOException {
if (targetType.getRawClass() == ArrayList.class && t == JsonToken.VALUE_STRING) {
return new ArrayList<>();
}
return super.handleUnexpectedToken(ctxt, targetType, t, p, failureMsg);
}
})
.build();
推荐阅读
- git - Gitlab CI 不适用于 Gitlab Registry 中的私有图像
- node.js - TypeError:无法设置 null - 节点和 Mongoose 的属性“brief_title”
- c++ - 需要 GLIBC 2.7 版本。使用更高版本的 GLIBC 编译 C++ 代码,同时支持更早的 glibc
- django-rest-framework - 如何使用 POST 数据中的 allauth save_user 方法设置自定义用户字段
- python - 如果给定条件,如何计算欧几里得距离?
- laravel - 非法字符串偏移 '' Laravel
- c# - Identity Server 4 无法验证我的访问令牌
- python - 无法从 pycharm 引用 PyQt5
- linux - bash set -e (errexit) 仅适用于管道中的最后一个命令?
- applescript - 期待结束,但继续寻找