首页 > 解决方案 > 使用 RestEasy 处理没有“根”元素的 JSON 响应

问题描述

我调用一些 Web 服务(用 Ruby 构建)并得到如下 JSON 响应:

{
    "error_code": "02",
    "message": "Param not valid",
    "field_name": "title"
}

为了在 Java 中建模该响应对象,我尝试使用:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "response")
public class Response {
    
    private String error_code;
    private String message;
    private String field_name;
    
    public String getError_code() {
        return error_code;
    }
    public void setError_code(String error_code) {
        this.error_code = error_code;
    }
    
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    
    public String getField_name() {
        return field_name;
    }
    public void setField_name(String field_name) {
        this.field_name = field_name;
    }
            
}

...并在我的 WS 客户端中读取 WS 调用的响应,我尝试:

Response response = responseWs.readEntity(Response.class);

...但我得到以下异常:

org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException:javax.xml.bind.UnmarshalException
 - 有关联的例外:
[com.sun.istack.internal.SAXParseException2; columnNumber: 0 意外元素...预期元素是

那是因为我的代码试图处理这样的 JSON 响应对象(带有一些“根”元素):

{
    "response":
    {
        "error_code": "02",
        "message": "Param not valid",
        "field_name": "title"
    }       
}

有人知道我该如何解决这种情况吗?

谢谢

标签: javajsonrestresteasy

解决方案


对我来说,这个片段解决了这个问题:

String responseAsString = responseWs.readEntity(String.class);
ObjectMapper mapper = new ObjectMapper();
JsonNode pathNode = mapper.readTree(responseAsString);
Response response = mapper.convertValue(pathNode, Response.class);

推荐阅读