2010-11-29 178 views
2

我有使用GSON庫的反序列化問題。GSON反序列化問題

以下是JSON代碼,我嘗試反序列化

{"response": { 
    "@service": "CreateUser", 
    "@response-code": "100", 
    "@timestamp": "2010-11-27T15:52:43-08:00", 
    "@version": "1.0", 
    "error-message": "", 
    "responseData": { 
    "user-guid": "023804207971199" 
    } 
}} 

我創建了以下類

public class GsonContainer { 

     private GsonResponse mResponse; 

     public GsonContainer() { } 

     //get & set methods 

} 

public class GsonResponse { 

    private String mService; 
    private String mResponseCode; 
    private String mTimeStamp; 
    private String mVersion; 
    private String mErrorMessage; 

    private GsonResponseCreateUser mResponseData; 

    public GsonResponse(){ 

    } 

    //gets and sets method 
} 

public class GsonResponseCreateUser { 

    private String mUserGuid; 

    public GsonResponseCreateUser(){ 

    } 

    //get and set methods 
} 

調用GSON庫中的數據爲空後。任何想法什麼是錯誤的類?

THX提前爲您的幫助......我想這是一些小事....

回答

0

JSON響應上面不能GSON因爲特殊字符的反序列化和@ - 。 GSON基於反射,並且成員變量必須完全匹配JSON響應中給出的內容。

+4

這是不正確的。 – 2011-06-06 22:27:52

9

@ user523392說:

成員變量必須匹配究竟是什麼在JSON響應

這不是的情況作了說明。

有幾個選項可以指定Java字段名稱如何映射到JSON元素名稱。

上述原始問題的一種解決方案是使用@SerializedName註釋Java類成員,以非常明確地聲明它映射到的JSON元素名稱。

// output: [MyObject: element=value1, elementTwo=value2] 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.annotations.SerializedName; 

public class Foo 
{ 
    static String jsonInput = 
     "{" + 
      "\"element\":\"value1\"," + 
      "\"@element-two\":\"value2\"" + 
     "}"; 

    public static void main(String[] args) 
    { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    Gson gson = gsonBuilder.create(); 
    MyObject object = gson.fromJson(jsonInput, MyObject.class); 
    System.out.println(object); 
    } 
} 

class MyObject 
{ 
    String element; 

    @SerializedName("@element-two") 
    String elementTwo; 

    @Override 
    public String toString() 
    { 
    return String.format(
     "[MyObject: element=%s, elementTwo=%s]", 
     element, elementTwo); 
    } 
} 

另一種方法是創建一個自定義FieldNamingStrategy指定Java成員的名字如何翻譯成JSON元素名稱。此示例將對所有Java成員名稱應用相同的名稱映射。這種方法不適用於上面的原始示例,因爲不是所有的JSON元素名稱都遵循相同的命名模式 - 它們並不全部以「@」開頭,有些使用駱駝命名而不是將名稱部分與' 」。在構建Gson實例(gsonBuilder.setFieldNamingStrategy(new MyFieldNamingStrategy());)時,將使用此實例FieldNamingStrategy

class MyFieldNamingStrategy implements FieldNamingStrategy 
{ 
    // Translates the field name into its JSON field name representation. 
    @Override 
    public String translateName(Field field) 
    { 
    String name = field.getName(); 
    StringBuilder translation = new StringBuilder(); 
    translation.append('@'); 
    for (int i = 0, length = name.length(); i < length; i++) 
    { 
     char c = name.charAt(i); 
     if (Character.isUpperCase(c)) 
     { 
     translation.append('-'); 
     c = Character.toLowerCase(c); 
     } 
     translation.append(c); 
    } 
    return translation.toString(); 
    } 
} 

另一種方法來管理Java字段名是如何映射到JSON元素名稱是建設時Gson實例,例如,gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);指定FieldNamingPolicy。但是,這也不適用於原始示例,因爲它將相同的名稱映射策略應用於所有情況。