2014-01-14 58 views
1

在我的Android應用程序,我回到簡單的鍵值對一個簡單的JSON對象,如:解析JSON來枚舉字段

{"username" : "billySmith", "gender" : 1} 

並與相應的字段名usernamegender(字符串和INT的枚舉, 分別)。

我想使用Gson來解析JSON對象並用JSON值填充枚舉字段。我有點不確定如何將GSON與枚舉結合使用。我熟悉一個對象的實例應該被設置爲等於gson.fromJson(jsonObect, instanceType.class);的概念。

要添加更多詳細信息,我使用枚舉,以便可以從我的Android項目中的任何位置檢索值。

if (response.getStatusLine().getStatusCode() == 200 && result != "") 
{        
    GlobalEnum globalEnum = GlobalEnum.getInstance(); 
    Gson gson = new GsonBuilder().create(); 
    globalEnum = gson.fromJson(result, GlobalEnum.class); 
} 

其中 「結果」 是一個HTTP響應的實體的字符串表示

GlobalEnum片段:

public enum GlobalEnum 
{ 
    INSTANCE; 

    private String username; 
    private int gender; 

    public static GlobalEnum getInstance() 
    { 
     return INSTANCE; 
    } 

    public int getGender() 
    { 
     return gender; 
    } 

    public void setGender(int gender) 
    { 
     this.gender = gender; 
    } 
} 

*編輯: 重述:我有一個枚舉,我有一個JSONObject 。枚舉和JSON對象都有「用戶名」和「性別」。使用Gson,我想解析JSON對象,以便將JSON對象中的值分配給Enum中的相應字段。

+0

你可以發佈'GlobalEnum'代碼嗎? – everton

+0

添加片段 – rperryng

+0

查看Enums:http://docs.oracle.com/javase/tutorial/java/javaOO/enum。html – everton

回答

0

您可能誤解了Java中的Enum的含義。他們通常不應該像這樣在運行時打開修改。

我想下面的邏輯會更好地爲您服務,當您將JSON解析爲Enums時,您可以免於此類麻煩。

首先,UserInformation Java bean類,包裹usernamegender領域:

public class UserInformation 
{ 
    private String username; 
    private int gender; 

    public UserInformation(String username, int gender) 
    { 
     this.username = username; 
     this.gender = gender; 
    } 

    public String getUsername() 
    { 
     return username; 
    } 
    public void setUsername(String username) 
    { 
     this.username = username; 
    } 
    public int getGender() 
    { 
     return gender; 
    } 
    public void setGender(int gender) 
    { 
     this.gender = gender; 
    } 
} 

然後你GlobalEnum類,重命名爲GlobalValues和修改工作作爲一種價值容器:

public abstract class GlobalValues 
{ 
    // You can also create get/set methods for encapsulation if you want 
    public static UserInformation userInformation; 
} 

然後,將您的JSON字符串解析爲您的UserInformation對象的邏輯,然後將其存儲在您的GlobalValues班。

String jsonStr = "{\"username\" : \"billySmith\", \"gender\" : 1}"; 

Gson gson = new Gson(); 

GlobalValues.userInformation = gson.fromJson(jsonStr, UserInformation.class); 
+0

謝謝。我更清楚地理解這背後的邏輯。但是我陷入了一個錯誤。 我已初始化以下內容:'UserInformation userInformation = GlobalValues.userInformation;'。當我嘗試在此instnace上調用setter/getters時,我收到一個空指針異常...即使我只是調用GlobalValues.userInformation的getter和setter,我仍然會收到異常。 – rperryng

+0

'GlobalValues.userInformation'將保持爲空,直到您第一次加載它們。您可能必須實例化並填充您的UserInformation對象,然後將它們設置爲GlobalValues.userInformation。 – everton

+0

我用'public static UserInformation userInformation = new userInformation()'替換了'public static UserInformation userInformation;'在GlobalValue的作用域中,現在如果我使用GlobalValues.userInformation引用實例,情況似乎正常。這看起來合理嗎? – rperryng

1

正如我在評論中所說的,你需要創建一個類型適配器,以便在json解析期間獲得你的枚舉。這是我爲我的目的所做的一個例子。 在您的枚舉創建TypeAdapterFactory gsonTypeAdaptor像這樣:

public static TypeAdapterFactory gsonTypeAdaptor = new TypeAdapterFactory() { 
     @Override 
     public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { 
      Class<T> rawType = (Class<T>) type.getRawType(); 
      if (!(rawType.isEnum() && Predicates.assignableFrom(rawType).apply(<your enum>.class))) { 
       return null; 
      } 
      return new TypeAdapter<T>() { 
       public void write(JsonWriter out, T value) throws IOException { 
        if (value == null) { 
         out.nullValue(); 
        } else { 
         out.value(((<your enum>)value).name); 
        } 
       } 
       public T read(JsonReader reader) throws IOException { 
        if (reader.peek() == JsonToken.NULL) { 
         reader.nextNull(); 
         return null; 
        } else { 
         return (T) <get your enum by using reader.nextString()>; 
        } 
       } 
      }; 
     } 
    }; 

一個適配器是否到位,與你gson builder註冊它像這樣: builder.registerTypeAdapterFactory(<your enum>.gsonTypeAdaptor);

讓我知道這是有益的。