2012-02-06 57 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