如何从Java

时间:2017-07-13 14:39:20

标签: java java-8 gson

我使用gson反序列化包含许多不同类的实例的json。只要我事先了解所有课程,以下工作就可以了:

    String receivedPayloadStr = receivedMessage.get("payload");
    Type payloadType = getType(receivedMessage.get("type").toString());
    Object typedPayload = gson.fromJson(payloadJson, payloadType);
    System.out.println(typedPayload);

我的getType函数如下:

static Type getType(String typeName){
    switch (typeName){
        case "mypackage1.MyThing1":
            return new TypeToken<MyThing1>() {}.getType();
        case "mypackage2.MyThing1":
            return new TypeToken<MyThing2>() {}.getType();
        default:
            throw new RuntimeException("Unsupported type: " + typeName);
    }
}

哪个有效,短期,但是丑陋和脆弱。显然,我们需要一种更易于维护的方法。有没有办法以一般方式实现getType,所以它支持所有已知类?

编辑:我们不仅限于gson。如果另一个库使任务更容易,我们可以切换到它。

2 个答案:

答案 0 :(得分:3)

Gson的TokenType具有静态工厂方法,您可以像这样使用它:

public Type getType(String name) {
    try {
        Class<?> clazz = Class.forName(typeName);
        TypeToken<?> typeToken = TypeToken.get(clazz);
        return typeToken.getType();
    } catch (ClassNotFoundException e) {
        throw new IllegalArgumentException("Unsupported type: " + typeName, ce);
    }
}

这可以帮助您完成大部分不涉及泛型或通配符的情况(或者通配符有界限的情况,在这种情况下,您应该获得边界上正确的参数化类型)。

免责声明:我没有对此进行过测试。

另外,您可能需要查看Guava的TypeToken版本。

答案 1 :(得分:-1)

试试这个: 我没有测试它,但似乎是正确的:

static Type getType(String name){
    return new TypeToken<Class.forName(name)>(){}.getType();
}