代码之家  ›  专栏  ›  技术社区  ›  nuoritoveri

如何在一条Json消息中发送不同类的对象,以便使用Gson对它们进行去序列化?

  •  1
  • nuoritoveri  · 技术社区  · 11 年前

    我想发送消息(使用RabbitMQ,但我认为这并不重要)。消息文本为Json格式。我想在一条消息中发送关于两个类的信息。在侦听器站点上,我希望使用Gson反序列化消息,以便再次获取对象。

    一个对象是简单对象,第二个是简单对象列表。我找不到如何将两个不同的对象串联到一个Json中,所以我将它们打包到一个地图中,并从这个地图中发出一条消息:

    A a = new A();
    ArrayList<B> bList = new ArrayList<B>();
    bList.add(new B());
    bList.add(new B());
    
    HashMap<String, Object> map = new LinkedHashMap<>();
    map.put("A", a);
    map.put("B", bList);
    
    String messageText = gson.toJson(map);
    

    如果我现在想取消消息的序列化:

    HashMap<String, Object> sentItems = gson.fromJson(messageText, HashMap.class);
    A a = (A) sentItems.get("A");
    Collection<B> bList = (Collection<B>) sentItems.get("B");
    

    我有个例外 get("A") :

    com.google.gson.internal.StringMap cannot be cast to A.
    

    我可以解决这个问题吗?或者我应该采取其他方法来获得我想要的东西吗?

    编辑:

    如果我通知Gson我要使用的类型,则错误相同:

       Type type = new TypeToken<HashMap<String, Object>>() {}.getType();
        HashMap<String, Object> sentItems = gson.fromJson(argument.getValue(), type);
    
    2 回复  |  直到 11 年前
        1
  •  1
  •   lotk    11 年前

    我认为您需要首先将“messageText”反序列化为JsonObject,如下所示:

    JsonElement jsonElem = gson.fromJson(messageText, JsonElement.class);
    JsonObject jsonObject = jsonElem.getAsJsonObject();
    

    然后按名称提取元素,并反序列化为请求的类型:

    JsonElement jsonA = jsonObject.get("A");
    A a = gson.fromJson(jsonA, A.class);
    

    对于列表元素:

    JsonElement jsonBs = jsonObject.get("B");
    Type bListType = new TypeToken<List<B>>(){}.getType();
    List<B> dataSetIds = gson.fromJson(jsonBs, bListType);
    
        2
  •  1
  •   Yagnesh Agola    11 年前

    您需要创建一个包含两个变量的类 A 另一个是 List of class 并反序列化该新类。

    Class Parent{
        private A a;
        private ArrayList<B> bList;  
    
       //getter and setter method here.
    }  
    

    在反序列化时,将JSON字符串反序列化为类 Parent 对象,获取的值 a bList 从getter方法,如下所示:

    Parent p = gson.fromJson(messageText, Parent.class);  
    A a = p.getA();  
    ArrayList<B> bList = p.getBList();    
    

    编辑:
    类内变量的名称 父母亲 那就是 b列表 与HashMap的键相同 map 在另一侧。你的情况应该是 A. 而不是 B 而不是 b列表 .