2012-02-06 83 views
1

我有一個JSON字符串是這樣的: http://pastebin.com/ckUZadwL如何解析這些json字符串? (使用GSON)

我試圖用GSON解析他們。但是,我有一個問題。在新的響應中,user元素包含通用id作爲鍵,並且由於它在內部類中,所以我不確定如何解析它。

謝謝你的幫助。

這裏有幾個類容器我建立並存儲在那裏的數據:

public class CometCallback 
{ 
    public int new_offset; 
    public Data[] data; 
} 

public class Data 
{ 
    public long plurk_id; 
    public int response_count; 
    public Response response; 
    public UserInfo user; 
    public String type; 
    public Plurk plurk; 
} 

public class Response 
{ 
    public String lang; 
    public String content_raw; 
    public long user_id; 
    public String qualifier; 
    public long plurk_id; 
    public String content; 
    public long id; 
    public String posted; 
} 

public class Plurk extends Response 
{ 
    public Object[] replurkers; 
    public int responses_seen; 
    public int replurkers_count; 
    public String replurker_id; 
    public int response_count; 
    public boolean replurkable; 
    public Object limited_to; 
    public int favorite_count; 
    public int is_unread; 
    public Object[] favorers; 
    public int plurk_type; 
    public boolean replurked; 
    public boolean favorite; 
    public int no_comments; 
    public long owner_id; 
} 

回答

1

我有幾個東西分享關於你的帖子:

  1. 將要面臨的最大問題是,用戶非常奇怪 json序列化 - 它的id被用作鍵。我能想到的唯一方法是使用GsonBuilderenableComplexMapKeySerialization選項。然後,您需要聲明UsewrInfo僅包含一個元素Map<Integer, User>並聲明User bean具有映射到該id的所有屬性。
  2. 我想你知道,有GSON它不需要有 類匹配的字段名稱在GSON鍵。例如,你仍然可以使用一個camel-based newOffset並在其中解析字段new_offset。 您只需將gson註釋 @SerializedName("new_offser")放置在該字段的聲明之上。
  3. 這裏是你如何從json使用gson進行反序列化。這是真的 直截了當:

    Gson gson = new GsonBuilder() 
        .enableComplexMapKeySerialization() 
        .serializeNulls() 
        .setDateFormat(MY_DATE_FORMAT) 
        .create(); 
    CometCallback cometCallback = gson.fromJson(jsonFile, CometCallback.class) ; 
    

    我對DateFormat在下一節討論的選項。 serializeNulls是必要的,因爲我看到了空 值的屬性也將被序列像"date_of_birth": null

  4. 關於DateFormat - 我看到你聲明public String posted; 作爲字符串。然而GSON可以,只要您指定的日期 將是正確的格式解析日期直接從JSON 字符串爲您這裏是正確的格式,我認爲你定義日期 在:

    public static final SimpleDateFormat MY_DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"); 
    

    現在宣佈這一點,並通過它在 setDateFormat(MY_DATE_FORMAT)方法,你應該能夠改變 你所有的日期將被解讀爲日期和GSON將解析它們。

  5. 順便說一句,我想你知道它,但你可以反序列化JSON 陣列例如列表。發生這種情況只需相應地聲明 字段,gson將自動存儲在其中。

希望這一切都將幫助你反序列化的數據。快樂的編碼!

+0

謝謝你的建議,我有幾件事情來嘗試現在:) – Patrick 2012-02-06 14:31:02

+0

感謝您的信息。我似乎能夠提取我想要的價值!我需要進一步測試以瞭解「enableComplexMapKeySerialization」的功能。 – Patrick 2012-02-07 17:43:11

+0

嗡嗡聲...似乎它仍然會反序列化爲Map對象,即使沒有啓用ComplexMapKeySerialization。我猜Map 不是一個複雜的關鍵,但很高興知道我可以在將來像這樣解析複雜關鍵字! – Patrick 2012-02-08 05:55:28