我正在连接一个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>>(){});
,但是在尝试解析响应之前我不知道它是否会失败。
任何人都知道如何解决这个问题?
答案 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
}
}