java / jersey用可能存在的列表解析json响应

时间:2017-10-11 09:39:52

标签: java jackson jersey

我正在连接一个api,它可以返回一个对象或一个错误列表(我将不得不提供虚构的例子,抱歉,但它们应该是准确的):

预期json:

{
    "type":"someType",
    "list": [
        {
            "attribute":"someAttribute"
        }
    ]
}

错误时:

[
    {
        "error":"1",
        "someField":"someValue"
    }
]

使用泽西岛,我现在正在做这样的事情:

client.target(endpoint).request().post(Entity.json(request)).readEntity(ResponseObject.class);

ResponseObject.java

private List<Failure> messages;
private String type;
private List<ListObject> list;
// set/get

Failure.java

private String error;
private String someField;
// set/get

当我得到预期的json时,这似乎工作正常,但是当API返回错误时我得到JsonMappingException: Can not deserialize instance of [..] out of START_ARRAY token异常。

当我收到错误时,我可以使用response.readEntity(new GenericType<List<Failure>>(){});,但是在尝试解析响应之前我不知道它是否会失败。

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

所以,如果我可以这样做,我的问题就会消失:

try {
    return response.readEntity(ResponseObject.class);
} catch (MappingException ex) {
    ResponseObject responseObject = new ResponseObject();
    responseObject.setFailureList(response.readEntity(new GenericType<List<Failure>>(){});
    return responseObject;
}

但是,readEntity关闭了流,所以这是不可能的。

我最后做了一个解决方法,我首先从响应中读取String(获取原始结果并关闭流),然后尝试解析它,如果我得到初始解析错误,我尝试解析它作为错误消息:

private <T> T parseAfterPayJson(String json, Class<T> responseClass) {
    Gson gson = new Gson();

    try {
        return gson.fromJson(json, responseClass);
    } catch (JsonSyntaxException jsex) {
        ResponseObject responseObject = new ResponseObject();
        responseObject.setFailures(Lists.newArrayList(gson.fromJson(json, Failure[].class)));
        return (T) responseObject; // this part is because of inheritance
    }
}