【问题标题】:JSON inner field parsing with GSON使用 GSON 解析 JSON 内部字段
【发布时间】:2015-10-14 00:34:33
【问题描述】:

我是 JSON 新手,与我研究过的任何其他解析方法相比,我喜欢 GSON Api 的强大和直接。
我想解析一个相当复杂的 JSON(使用 GSON),它在结构上类似于以下 JSON:

[
  {  
  "name": "Steve",
  "age": 42,
  "description": null,
  "email1": "steve@example.com",
  "email2": null,
  "address1": {
    "type": "home",
    "shippingMethod": "Charge by quantity",
    "street": "Sunrise Ave",
    "streetNo": 17
     },
   "address2": {
    "type": "office",
    "shippingMethod": null,
    "street": "Sunset Ave",
    "streetNo": 71
     },
   "anotherField": "another value"
   },
   {
   "name": "Johnny",
   ...
   "anotherField": "some other value"
   }
]  

我可以看到我需要用一个客户端对象数组来包装它,因为我的 JSON 以“[”开头,而且我还可以看到我需要另一个容器类用于内部字段 address1 和 address2。这是我想出的容器:

public class Client {
  String name;
  int age;
  String description;
  String email1;
  String email2;
  ClientAddress address1;
  ClientAddress address2;
  String anotherfield;
  ..
  getters() and setters()

  public class ClientAddress {
    String type;
    String shippingMethod;
    String street;
    int streetNo;
    ..
    getters() and setters()
  }
}

我为获取数据并填充包装器字段而编写的指令是:

Client[] clientsArray= (new Gson()).fromJson(jsonClients, Client[].class);

结果只是部分令人满意;我设法访问了所有原始字段(例如 name、email1..),但 address1 和 address2 字段均为空。结果,

clientsArray[i].getAddress1().getShippingMethod();

返回一个空字符串。

我哪里做错了?
有没有一种特殊的方法来创建我缺少的类?

注意:从结构的角度来看,我的 JSON 对象是完全有效的。如果您看到任何错误,可能是因为我在手动创建上述虚拟/演示时它们滑倒了。

【问题讨论】:

  • 我在您的JSON 中注意到:"shippingMethod": null,。你确定你没有得到其中之一吗?并且address1address2 不能为空,否则在尝试调用空引用上的方法时会得到 NPE。
  • @vinitius 好的,所以您是说 JSON 中的“空白”字段应该类似于“shippingMethod”:“”,“not shippingMethod”:null,否则会引发 NPE?同样适用于拥有自己的字段的字段? (在我的情况下是地址 1 和地址 2)?
  • @Razvan 没有。JSON 没问题。我是说:当 shippingMethod 确实为 null 时,您确定没有遇到这种情况吗? 我的意思是,如果 address1 和 adress2 为 null ,您会在这里遇到异常。所以GSON 似乎正在按预期解析 json。我没有看到与您的课程和您发布的 json 相关的任何错误
  • @vinitius 我得到的是非原始字段(地址 1 和地址 2)的空值,尽管如果我进入调试角度并检查 JSON 字符串,地址 1 和地址 2 字段就在那里。
  • @Razvan 如果 address1 是 null,则语句:clientsArray[i].getAddress1().getShippingMethod(); 将抛出 NPE。你有例外吗?如果不是,则它不为空,但属性shippingMehtod 可能会返回一个null 字符串,例如。正如您在发布的 json 中指出的那样,在某些情况下,此属性 shippingMehtod 是 , INDEED, null

标签: java android json parsing gson


【解决方案1】:

只关注GSON Collections good practices,尝试改变

 Client[] clientsArray= (new Gson()).fromJson(jsonClients, Client[].class);

 Type collectionType = new TypeToken<List<Client>>(){}.getType();
 List<Client> clientsArray = (new Gson()).fromJson(jsonClients, collectionType);

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 2011-11-30
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多