我想发送消息(使用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);
答案 0 :(得分:1)
您需要创建一个类,其中包含两个类A
的变量,另一个是List of class
B`值,并反序列化该新类。
Class Parent{
private A a;
private ArrayList<B> bList;
//getter and setter method here.
}
在反序列化时,将JSON字符串反序列化为类Parent
对象,从getter方法获取a
和bList
的值,如下所示:
Parent p = gson.fromJson(messageText, Parent.class);
A a = p.getA();
ArrayList<B> bList = p.getBList();
编辑:
类Parent
中a
和bList
的变量名称与另一侧的HashMap map
的键相同。在您的情况下,它应该是A
而不是a
和B
而不是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);