如何在Java中为gson确定运行时对象的类型

发布于 2024-10-19 10:30:25 字数 665 浏览 0 评论 0原文

看一下下面的代码,它运行得很好:

        MyData myData = new MyData(1, "one");
    MyData myData2 = new MyData(2, "two");
    MyData [] data = {myData, myData2};

    String toJson = gson.toJson(data, MyData[].class);

    MyData [] newData = gson.fromJson(toJson, MyData[].class);

MyData 只是一个带有 int 和 String 字段的简单类。这工作得很好。但是,如果类直到运行时才知道怎么办?例如,它可能不是“MyData”,但可能是完全不同的类。我们唯一知道的是类的名称(表示为字符串),该名称先前由发送者使用 Class.forName 确定。

如果对象不是数组,它就可以正常工作,如下所示:

    final Class<?> componentType = Class.forName(componentClassName);
context.deserialize(someElement, componentType);

但上述技术不适用于数组。

有什么建议吗?

Take a look at the following code, which works fine:

        MyData myData = new MyData(1, "one");
    MyData myData2 = new MyData(2, "two");
    MyData [] data = {myData, myData2};

    String toJson = gson.toJson(data, MyData[].class);

    MyData [] newData = gson.fromJson(toJson, MyData[].class);

MyData is just a simple class with int and String fields. This works perfectly fine. But what if the class is not known until runtime? e.g. It might not be "MyData", but could be a completely different class. The only thing we know is the name of the class (represented as a string), which was previously determined by the sender using Class.forName.

It works fine if the object is not an array, like so:

    final Class<?> componentType = Class.forName(componentClassName);
context.deserialize(someElement, componentType);

The above technique doesn't work for arrays though.

Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

澜川若宁 2024-10-26 10:30:25

您的意思是 MyData 将成为通用类型 T 吗?如果是这样,由于 Java 类型擦除,您将无法执行此操作。类型 T 仅在编译时可用。

您可以创建一个如下方法:

public T decodeJSON(String json, Class<T> type) {
    GSON gson = new GSON();
    return gson.fromJson(json, type);
}

Do you mean that MyData would become a generic type T? If so you won't be able to do this due to Javas type erasure. The type T is only available at compile time.

You could create a method like:

public T decodeJSON(String json, Class<T> type) {
    GSON gson = new GSON();
    return gson.fromJson(json, type);
}
橘虞初梦 2024-10-26 10:30:25

来获取对象的类

object.getClass();

在 java 中,你可以通过调用From java docs:

class Test {
    public static void main(String[] args) {
        int[] ia = new int[3];
        System.out.println(ia.getClass());
        System.out.println(ia.getClass().getSuperclass());
    }
}

,它打印:

class [I
class java.lang.Object

In java you can get the class of an object by calling

object.getClass();

From java docs:

class Test {
    public static void main(String[] args) {
        int[] ia = new int[3];
        System.out.println(ia.getClass());
        System.out.println(ia.getClass().getSuperclass());
    }
}

which prints:

class [I
class java.lang.Object
喜爱皱眉﹌ 2024-10-26 10:30:25
String toJson = gson.toJson(Class.forName(obj, runtimeClassName + "[]"));
String toJson = gson.toJson(Class.forName(obj, runtimeClassName + "[]"));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文