首页 > 解决方案 > 如何在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 令牌

希望对我有帮助,非常感谢。

标签: javaspringapirestjackson

解决方案


您可以注册com.fasterxml.jackson.databind.deser.DeserializationProblemHandler并实现handleUnexpectedToken方法。如果预期类型是ArrayList并且JsonTokenVALUE_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();

推荐阅读