如果已将特定类型的对象序列化为JSON作为对象,则如何从Java中的JSON反序列化特定类型的对象?

时间:2018-12-07 12:25:23

标签: java json gson deserialization

我是Java新手!

我的目标: 我收集了Objects,使我可以通过某个键(例如Map)保留任何类型的对象(将它们放入并从中获取)。我可以向其中添加任何类型的对象(例如,可以添加MyClass的对象)。然后,我使用GSON将这个对象序列化为JSON格式的单独字符串(然后,例如,我可以将该字符串序列化为单独的文件)。当我想找回一些对象时,我通过键从集合中请求它,集合将对应的字符串反序列化为Object对象并返回给我。然后,将其强制转换为MyClass才能使用该对象。

下面的代码跳过了集合的工作:

    Gson gson = new Gson();
    Object myClass = new MyClass(); //imitation of putting MyClass object to Collection
    String json = gson.toJson(myClass); //serializing to JSON
    Object myClass1 = gson.fromJson(json, Object.class); //imitation of deserializing and getting object from collection
    Main.MyClass myClass2 = (Main.MyClass) myClass1;

此代码的最后一个字符串引发java.lang.ClassCastException,因为“ gson.fromJson(json,Object.class);”返回类型为“ com.google.gson.internal.LinkedTreeMap”的对象

我如何实现自己的目标?

2 个答案:

答案 0 :(得分:2)

这可能是因为当您使用gson.fromJson(json, Object.class)时,将其强制转换为对象而不是MyClass,可能是如果使用gson.fromJson(json, MyClass.class)然后将其强制转换为它将返回正确的值。否则,他们将创建一个简单的对象类。

答案 1 :(得分:0)

gson.fromJson(json, Object.class);投射到LinkedTreeMap(请参见ObjectTypeAdapter.read(JsonReader in)中的gson资料)。

尝试一下:

Gson gson = new Gson();
Object myClass = new MyClass(); //imitation of putting MyClass object to Collection
String json = gson.toJson(myClass); //serializing to JSON
Main.MyClass myClass2 = gson.fromJson(json, Main.MyClass.class);