【问题标题】:"Dotting" in JSON using Gson on Android在 Android 上使用 Gson 在 JSON 中“打点”
【发布时间】:2011-08-18 10:21:37
【问题描述】:

我正在尝试在 Android 中使用 Gson 解析 JSON 提要。我知道 JSON 是有效的。我怀疑是因为格式是这样的:

 "Info":[
 {

"Id":"",
"Name":"",
"Description":"",
"Date":""
 }

为了解析这个,我需要“点”进去。例如:Info.Name

如何在序列化的 DTO 中执行此操作?

@SerializedName("Name")
public String name;

@SerializedName("Description")
public String desc;

@SerializedName("Date")
public String date;

我试着输入“信息”。在每个 serializedName 前面,但这也不起作用。我也知道我的 JSON 解析方法可以正常工作,因为它在其他地方使用了不同的 DTO。但在那个解析中,我不必“打点”问题。

谁能帮忙?

编辑:我已经尝试了你们发布的所有内容,但没有任何效果。错误说:

The JsonDeserializer failed to deserialize json object {"Info":[{".......

第二次编辑: 我能够摆脱错误,但现在它返回 null。哈哈,现在真的很郁闷!

【问题讨论】:

  • 您想将您的 json 代码放入 java 对象并访问成员吗?我对你的问题有点困惑。
  • 是的,没错。它适用于我的应用程序中的其他 json 解析,但当我必须“点”以从 json 提要中获取值时则不行

标签: java android json gson


【解决方案1】:

我假设您输入的实际 JSON 是有效的,因为您提供的示例不是。在您的 JSON 示例中,您有 "Info":[ 但没有包含“Info”属性的外部对象,这是必须的。有效的 JSON 是:

{
 "Info": [
           {
             "Id":"",
             "Name":"",
             "Description":"",
             "Date":"",
           }
         ]
}

这是一个 JSON 对象,具有一个属性“Info”,该属性的值是一个对象列表。此对象列表包含一个对象,该对象具有属性“Id”、“Name”、“Description”和“Date”,所有这些属性都具有空字符串值。

这是一个关于如何使用 GSON 解析 JSON 提要(例如上述 JSON)的快速教程:

您将需要一个类来表示列表中的项目:

public class InfoItem {
     public String Id;
     public String Name;
     public String Description;
     public String Date;
     public InfoItem() {}
}

还有一个代表项目列表:

public class InfoItemList extends LinkedList<InfoItem> {
    public InfoItemList() { super() };
}

这种增加的复杂性是因为 GSON 无法从类数据中获取泛型集合的类型。

还有一个代表整个 JSON 消息:

public class InfoMessage {
    public InfoItemList Info;
    public InfoMessage() {};
}

然后就是:

gson.fromJson(jsonString, InfoMessage.getClass());

如果只是反序列化一个集合:

Type listType = new TypeToken<List<InfoItem>>() {}.getType();
gson.fromJson(jsonString2, listType);

【讨论】:

  • 是的,JSON 是有效的,只是不想粘贴整个内容。我会试试这个并报告。
  • @Raijv M. InfoItemList 类是否应该扩展集合?它要求我更改为 Collections 或创建类 Collection ?
  • @Magnus 抱歉,不应该是 Collection,因为那是抽象的。我将其更改为扩展 LinkedList ,因为这是具体的。让我知道这是否适合您。
  • @Magnus 这个解决方案运气好吗?
【解决方案2】:

由于[],Info 对象是一个列表。您必须使用以下代码对其进行反序列化:

编辑:

public class Info {
    // as in your question
    public String name;
    ...
}
public class Data {
    @SerializedName("Info")
    public List<Info> info;
}

然后只需使用数据类来反序列化您的 json。

【讨论】:

  • 好的,想了想,我说的可能有误,我要验证一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多