2011-05-26 167 views
1

反序列化一個類似於值 的對象它不可能將json字符串反序列化爲具有類型參數的類型。 使用gson

我想寫這樣一個功能:

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

的Expample是:

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

我是否錯過了什麼?

+0

你的JSON例子並不代表一個數組,但你試圖將它反序列化爲一個'List'。因此,你的意圖是什麼混淆。請提供初始JSON輸入的有效示例。 – BalusC 2011-05-26 13:25:21

+0

對不起,我花了很少時間寫這個問題。希望它現在變得更清晰。 – scheffield 2011-05-27 07:05:51

回答

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(即有效負載是通用的;常見的部分是基本類型)。