首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法反序列化对java类对象的响应

无法反序列化对java类对象的响应
EN

Stack Overflow用户
提问于 2019-07-29 21:45:05
回答 1查看 559关注 0票数 0

在使用ObjectMapper解析json响应到Java类对象时,我得到了解析JsonMappingException的消息-无法从START_ARRAY令牌中反序列化com.handson.ResponseParser的实例

假设我有下面的json响应-

代码语言:javascript
复制
{
    "statuses": [
      {
        "engine": "f4651cbc-a79c-4269-9711-1aeaaeff6369",
        "invocations": [
          {
            "outputs": {
              "aggrplan": {
                "path": "http://someurl.com",
                "repo": "S3",
                "format": "application/json"
              }
            },
            "message": "complete",
            "status": "200"
          }
        ]
      }
    ],
    "request_id": "fce46502095607ef"
}

在main方法中,我通过下面的逻辑->进行解析

代码语言:javascript
复制
ResponseParser parser = null;
        if(result.length() > 0) {
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
            parser = objectMapper.readValue(result, ResponseParser.class);
        }

这是我想要将json响应映射到的类:

代码语言:javascript
复制
@JsonRootName(value = "statuses")
public class ResponseParser {

    @JsonProperty(value = "request_id")
    private String requestId;


    @JsonProperty(value = "statuses")
    private List<Map<String, String>> statuses;

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public List<Map<String, String>> getStatuses() {
        return statuses;
    }

    public void setStatuses(List<Map<String, String>> statuses) {
        this.statuses = statuses;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-08-05 00:48:19

您的POJO不适合JSON负载。首先,您不需要DeserializationConfig.Feature.UNWRAP_ROOT_VALUE,因为ResponseParser是您的根对象。其次,您需要使用带有Object值而不是String值的List<Map<String, Object>> - Map,而不是List<Map<String, String>>。如下例所示:

代码语言:javascript
复制
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.readValue(jsonFile, ResponseParser.class));
    }
}

class ResponseParser {

    @JsonProperty(value = "request_id")
    private String requestId;

    private List<Map<String, Object>> statuses;

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public List<Map<String, Object>> getStatuses() {
        return statuses;
    }

    public void setStatuses(List<Map<String, Object>> statuses) {
        this.statuses = statuses;
    }

    @Override
    public String toString() {
        return "ResponseParser{" +
                "requestId='" + requestId + '\'' +
                ", statuses=" + statuses +
                '}';
    }
}

上面的代码打印:

代码语言:javascript
复制
ResponseParser{requestId='fce46502095607ef', statuses=[{engine=f4651cbc-a79c-4269-9711-1aeaaeff6369, invocations=[{outputs={aggrplan={path=http://someurl.com, repo=S3, format=application/json}}, message=complete, status=200}]}]}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57255222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档