如果我可以获取以下JSON正文之一作为响应:
{
"error" : "some error",
"code": 123
}
或
[
{
"name" : "name",
"value" : "value"
},
{
"name" : "name",
"value" : "value"
}
]
是否有一种方法可以使用注释将这些响应中的任何一个映射到Java POJO以下?
public class Response {
String error;
int code;
List<NameValuePair> nameValuePairs;
}
答案 0 :(得分:0)
开箱即用,仅错误响应将反序列化。问题是它们本质上是不同的类型-对象与数组。
您可以使其与杰克逊的自定义模块一起使用,如here
所述答案 1 :(得分:0)
一个可能的响应是JSON Object
,另一个可能是JSON Array
。在这种情况下,不可能创建一个POJO
类来处理它。同样,这两个有效载荷对不同的含义:一个是SUCCESS
,另一个是ERROR
有效载荷。在那种情况下,我将使用Facade design pattern创建额外的层并将该复杂的逻辑隐藏在那里。可能如下所示:
class ResponseDeserialiserFacade {
private final ObjectMapper mapper = new ObjectMapper();
public List<NameValuePair> deserialisePairs(String json) {
try {
return mapper.readValue(json, new TypeReference<List<NameValuePair>>() {
});
} catch (IOException e) {
try {
Error error = mapper.readValue(json, Error.class);
throw new RequestApiException(error, e);
} catch (IOException e1) {
throw new RequestApiException(Error.from("Can not parse: " + json), e1);
}
}
}
}
您注意到我引入了新的异常:
class RequestApiException extends RuntimeException {
private final Error error;
RequestApiException(Error error, Exception base) {
super(base);
this.error = error;
}
public Error getError() {
return error;
}
}
具有Error
类:
class Error {
private String error;
private String code;
public static Error from(String message) {
Error e = new Error();
e.error = message;
return e;
}
// getters, setters, toString
}
现在,我们可以对其进行SUCCESS
和ERROR
有效载荷的测试:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.List;
public class JsonApp {
public static void main(String[] args) {
String success = "[\n" +
" {\n" +
" \"name\" : \"name\",\n" +
" \"value\" : \"value\"\n" +
" },\n" +
" {\n" +
" \"name\" : \"name\",\n" +
" \"value\" : \"value\"\n" +
" }\n" +
"]\n";
tryToParse(success);
String error = "{\n" +
" \"error\" : \"some error\",\n" +
" \"code\": 123\n" +
"}";
tryToParse(error);
}
private static void tryToParse(String json) {
ResponseDeserialiserFacade deserialiser = new ResponseDeserialiserFacade();
try {
List<NameValuePair> pairs = deserialiser.deserialisePairs(json);
System.out.println("SUCCESS: " + pairs);
} catch (RequestApiException e) {
System.out.println("ERROR: " + e.getError());
}
}
}
class NameValuePair {
private String name;
private String value;
// getters, setters, toString
}
上面的代码显示:
SUCCESS: [NameValuePair{name='name', value='value'}, NameValuePair{name='name', value='value'}]
ERROR: Error{error='some error', code='123'}
如您所见,我们将错误消息视为异常。