【问题标题】:How to deserialize object of specific type from JSON in Java if it was serialized to JSON as Object?如果将Java中的JSON序列化为JSON作为对象,如何从Java中反序列化特定类型的对象?
【发布时间】:2019-05-09 05:15:45
【问题描述】:

我是 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”类型的对象

我怎样才能达到我的目标???

【问题讨论】:

标签: java json gson deserialization


【解决方案1】:

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

【讨论】:

  • 是的。我看到MyClass 是一个内部类;所以只要确保它是static
【解决方案2】:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多