如何在一个Json消息中发送不同类的对象,以便可以使用Gson反序列化?

时间:2014-03-13 12:37:02

标签: java json gson

我想发送消息(使用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 个答案:

答案 0 :(得分:1)

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

Class Parent{
    private A a;
    private ArrayList<B> bList;  

   //getter and setter method here.
}  

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

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

编辑:
ParentabList的变量名称与另一侧的HashMap map的键相同。在您的情况下,它应该是A而不是aB而不是bList

答案 1 :(得分:1)

我认为您需要首先将“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);

对于list元素:

JsonElement jsonBs = jsonObject.get("B");
Type bListType = new TypeToken<List<B>>(){}.getType();
List<B> dataSetIds = gson.fromJson(jsonBs, bListType);