我正在尝试使用我的Android应用程序上的GSON库解析JSON。我可以正确解析一个JSON数组,但是现在我需要用这个结构解析另一个json:
{
"articles": [
{
"article": {
"articleId": 1,
"articleName": "Bocadillo de calamares",
"merchantId": 2,
"price": 3.5
},
"computable": true,
"orderArticleId": 3157,
"orderId": 203,
"price": 3.5,
"requestedDate": "2012-11-19 13:15:20",
"shared": true,
"status": "AS01_INITIAL"
},
{
"article": {
"articleId": 3,
"articleName": "Desayuno",
"merchantId": 2,
"price": 2.2
},
"computable": true,
"orderArticleId": 3158,
"orderId": 203,
"price": 0,
"requestedDate": "2012-11-19 13:17:30",
"shared": true,
"status": "AS01_INITIAL"
},
{
"article": {
"articleId": 2,
"articleName": "Café",
"merchantId": 2,
"price": 1.1
},
"computable": true,
"orderArticleId": 3156,
"orderId": 203,
"price": 1.1,
"requestedDate": "2012-11-19 13:15:20",
"shared": true,
"status": "AS01_INITIAL"
},
{
"article": {
"articleId": 1,
"articleName": "Bocadillo de calamares",
"merchantId": 2,
"price": 3.5
},
"computable": true,
"orderArticleId": 3155,
"orderId": 203,
"price": 3.5,
"requestedDate": "2012-11-19 12:40:17",
"shared": true,
"status": "AS01_INITIAL"
}
],
"comment": null,
"creationDate": "2012-11-19 12:06:41",
"customer": {
"creationDate": 1353321506000,
"customerId": 152,
"devices": [
{
"customerId": 152,
"deviceId": "2000",
"phone": null
}
],
"image": false,
"mail": null,
"name": null,
"password": null
},
"finishDate": null,
"group": 0,
"groupOrders": [],
"location": {
"location": "Table 1",
"locationId": 1,
"shopId": 2
},
"orderId": 203,
"parentOrderId": 192,
"score": null,
"shopId": 2,
"status": "OS01_INITIAL",
"ticketUrl": null,
"tip": null,
"total": 0,
"totalArticles": 0,
"type": "BILL"
}
I have a Order.class like this:
public class Order {
private final String orderId;
(....)
private final ArrayList<Articles> articles;
private final String group;
public Order() {
orderId = "";
(....)
articles = new ArrayList<Articles>();
group = "";
}
public String getOrderId() {
return orderId;
}
(... All getters for each element)
public ArrayList<Articles> getArticles() {
return articles;
}
}
还有一篇Articles.class
public class Articles {
private final String orderArticleId;
(...)
private final ArrayList<Article> article;
public Articles() {
orderArticleId = "";
(....)
article = new ArrayList<Article>();
};
public String getPrice() {
return price;
}
(....All getters for each element)
public ArrayList<Article> getArticle() {
return article;
}
}
而且,在我的主要活动中,我尝试获取所有信息:
final Gson gson = new Gson();
Order o = gson.fromJson(jsonData, Order.class);
System.out.println(" - " + o.getOrderId() );
并且工作正常,但如果我想获取文章信息,则值为空,我不知道如何获得它。
我试着用这样的东西:
Type collectionType = new TypeToken<List<Merchants>>() {
}.getType();
data = gson.fromJson(response, collectionType);
我尝试使用ArticlesWrapper,但我不知道该怎么做。 但我想我忘了什么......我不知道是什么。 在应用程序的另一部分中,我正确地反序列化了一个JSON,因为它是一个数组,但在这种情况下,我不知道如何才能正确获取所有数据。
如果您需要更多信息,我会为您提供! 谢谢!
答案 0 :(得分:12)
这是因为您没有正确地将JSON结构转换为Java POJO,基本上省略了一些具有以下结构的字段。
+ Order
+ List<BigArticle> articles
+ Customer customer
+ Location location
+ other basic fields
+ BigArticle
+ Article article
+ other basic fields
+ Article
+ basic fields
+ Customer
+ List<Device> devices
+ other basic fields
+ Device
+ basic fields
+ Location
+ basic fields
因此,您应该最终得到6个Java POJO,GSon应该能够在反序列化JSON数据时填充。
我刚刚在这里将你的JSON结构翻译成了POJO,我让Dates as String来简化解析。如果您想正确填充java.util.Date
,则必须自定义GSon实例。
主要课程
public class Main {
public static void main(String[] args) {
String jsonData = "...";
final Gson gson = new Gson();
Order o = gson.fromJson(jsonData, Order.class);
System.out.println("orderId: " + o.getOrderId());
System.out.println("first article price: " + o.getArticles().get(0).getPrice());
System.out.println("second article status: " + o.getArticles().get(1).getStatus());
System.out.println("third article requested date: " + o.getArticles().get(2).getRequestedDate());
}
}
<强>顺序强>
public class Order {
private List<BigArticle> articles;
private String comment;
private String creationDate;
private Customer customer;
private String finishDate;
private int group;
private List<Integer> groupOrders;
private Location location;
private int orderId;
private int parentOrderId;
private int score;
private int shopId;
private String status;
private String ticketUrl;
private String tip;
private int total;
private int totalArticles;
private String type;
// getters and setters
}
<强> BigArticle 强>
public class BigArticle {
private Article article;
private boolean computable;
private int orderArticleId;
private int orderId;
private double price;
private String requestedDate;
private boolean shared;
private String status;
// getters and setters
}
<强>文章强>
public class Article {
private int articleId;
private String articleName;
private int merchantId;
private double price;
// getters and setters
}
<强>客户强>
public class Customer {
private long creationDate;
private int customerId;
private List<Device> devices;
private boolean image;
private String mail;
private String name;
private String password;
// getters and setters
}
设备强>
public class Device {
private int customerId;
private String deviceId;
private String phone;
// getters and setters
}
位置强>
public class Location {
private String location;
private int locationId;
private int shopId;
// getters and setters
}
<强>输出强>
orderId: 203
first article price: 3.5
second article status: AS01_INITIAL
third article requested date: 2012-11-19 13:15:20