【问题标题】:Deserialize an object like Value<T> with gson使用 gson 反序列化像 Value<T> 这样的对象
【发布时间】:2011-05-26 12:50:44
【问题描述】:

将 json 字符串反序列化为带有类型参数的类型似乎是不可能的。

我想写一个这样的函数:

public <T> Value<T> getValue (json, Class<T> clazz) {

    // THE PROBLEM: T becomes Object so the resulting
    // Value will hold an Object as value
    Type type = new TypeToken<Value<T>>() {}.getType();
    return gson.fromJson(json, type);
}

一个例子是:

Value<User> value = new Value<User>(
        new User("Max", "Hu", new Address("5th Av.","NY")), "infos");

// Works fine
String json gson.toJson(value, new TypeToken<Value<User>>() {}.getType())
// dosen't work
getValue(json, User.class)

对应的类:

class Value<T> {
    T value;
    String someInfos;
}

class User {
    String name;
    String lastName;
    Address address;
}

class Address {
    String street;
    String city;
}

我错过了什么吗?

【问题讨论】:

  • 您的 JSON 示例不代表数组,但您正试图将其反序列化为 List。因此,您的意图令人困惑。请提供初始 JSON 输入的有效示例。
  • 对不起,我花了更少的时间写这个问题。希望现在更清楚了。

标签: java generics gson


【解决方案1】:

我不知道 GSON 会出现什么问题,但很可能是由于 TypeToken 的静态(编译时)性质,它阻止了动态变化(部分原因是 Java 类型擦除)。 但是,如果您不必为此使用 GSON,Jackson 可以轻松支持此用例。

您需要构造参数化的 JavaType (TypeFactory.parametricType(Value.class, clazz)),并将其作为要绑定的类型。比如:

ObjectMapper mapper = new ObjectMapper();
Value<User> user = mapper.readValue(json, mapper.getTypeFactory().parametericType(Value.class, User.class));

您可以将类似的逻辑封装在一个方法中。我用它来处理请求/响应 bean 的通用类型(即有效负载是通用的;常见的部分是基本类型)。

【讨论】:

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