【问题标题】:Parsing Json response to a different Java object each time每次解析 Json 响应到不同的 Java 对象
【发布时间】:2013-05-05 09:27:12
【问题描述】:

我使用 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(或者可以是三个类的超类的ArrayList)。现在,当我要求 Jersey 解析这个 JSON 响应时,它会在处理 list 时找到一个 ArrayList 并且不知道要解析的对象的确切类型是什么,因此它将数据转换为 -0、-1、- 2 到linkedHashMap 作为键/值对。

【问题讨论】:

  • 你试过Jackson吗?
  • 旁注 - Jersey 是 JAX-RS 提供程序,而不是 JSON 解析库。关于主题 - 返回的对象有什么共同点吗?将代码的相关部分添加到问题中。
  • 我在上面添加了更多说明
  • 在您的架构中,您可以将列表设为类型 A、B 和 C 的选择。如果所有类型都具有相同的基本类型,那么您可以将其设为该基本类型的列表。其余的应该由解组器处理

标签: java json parsing jersey


【解决方案1】:

我在 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
        }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多