试图用GSON解析JSON

时间:2012-11-19 22:17:12

标签: java android gson

我正在尝试使用我的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,因为它是一个数组,但在这种情况下,我不知道如何才能正确获取所有数据。

如果您需要更多信息,我会为您提供! 谢谢!

1 个答案:

答案 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