我使用 Jersey 作为客户端将 JSON 解析为 Java 对象, 问题是我使用的服务返回不同类型的响应,这些响应每次都应该映射到不同的 Java 对象,因此我需要一种方法来进入解析过程并做出任意决定来告诉 Jersey 确切的内容是什么每次要解析的对象类型。
编辑:
例如,如果我有 Java 类 A、B 和 C 以及 Json 响应,如下所示:
Data{
-list {
-0 :{Result should be mapped to A}
-1 :{Result should be mapped to B}
-2 :{Result should be mapped to C}
}
}
和list
是ArrayList(或者可以是这三个类的父类(super class)的ArrayList)。现在,当我要求 Jersey 解析这个 JSON 响应时,它会在处理 list
时找到一个 ArrayList并且不知道要解析的对象的确切类型是什么,因此它将 -0、-1、-2 内的数据转换为 linkedHashMap 作为键/值对。
最佳答案
我在 Jersey 客户端中使用 jackson 将 json 映射到 hashMap,但映射器也适用于 pojo。希望以下内容对您有所帮助。
将列表元素获取到数组/列表中。
循环并确定每个元素的正确类。
将每个列表元素及其各自的类名传递给处理映射并返回对象的方法。
import ...
import com.fasterxml.jackson.databind.ObjectMapper;
public class RequestProcessor {
void jerseyClient(){
//rest request
WebResource resource = ...
ClientResponse responseContent = resource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
List list = parseJSonResponse(responseContent);
for (String jsonListElement : list){
//determine correct class for jsonListElement
//Pass jsonListElement and class name to mapper method
Object obj = mapElementToObject(jsonListElement , className);
//do something with obj
}
}
private Object mapElementToObject(String jsonString, String className){
ObjectMapper mapper = new ObjectMapper();
Object obj = mapper.readValue(jsonString, Class.forName(className);
return obj;
}
private List parseJsonResponse(responseContent){
//use regexp to replace unnecessary content in response so you have a string
//that looks like -0:{element values}-1:{element values}-2:{element values}
//then split the string on "-.*\\:" into a array/list
//return the list
}
}
关于java - 每次将 Json 响应解析为不同的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383140/