如何解析这些json字符串? (使用gson)

时间:2012-02-06 05:00:29

标签: java json gson

我有一个像这样的json字符串: http://pastebin.com/ckUZadwL

我正在尝试使用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 个答案:

答案 0 :(得分:1)

我有几件事要分享你的帖子:

  1. 您将面临的最大问题是用户非常奇怪 json序列化 - 它的id用作键。我能想到的唯一方法是使用GsonBuilder的{​​{3}}选项。然后,您需要将UsewrInfo声明为仅包含一个元素Map<Integer, User>,并声明User bean,其中所有属性都映射到id。
  2. 我想你知道,使用gson不需要有 类字段名称与gson中的键匹配。例如,你仍然可以 使用驼峰式的newOffset并在其中解析new_offset字段。 你只需要放置gson注释 @SerializedName("new_offser")高于该领域的宣言。
  3. 以下是使用gson从json进行反序列化的方法。它是 真的很直白:

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

    我将在下一节讨论DateFormat的选项。 需要serializeNulls,因为我看到属性为null 值也会像"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自动存储在其中。
  6. 希望所有这些都可以帮助您反序列化您的数据。快乐的编码!