7

Android アプリで GSON ライブラリを使用して JSON を解析しようとしています。JSON 配列を正しく解析できましたが、次の estructure を使用して別の 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() );

正常に動作しますが、記事情報を取得したい場合、値は null であり、どうすれば取得できるかわかりません。

私はそのようなことを試みます:

 Type collectionType = new TypeToken<List<Merchants>>() {
            }.getType();
            data = gson.fromJson(response, collectionType);

ArticlesWrapper を使用しようとしていますが、正確な方法がわかりません。でも何か忘れてる気がする…そして何がわからない。アプリの別の部分では、配列であるため、JSON を正しく逆シリアル化しますが、この場合、すべてのデータを正しく取得する方法がわかりません。

さらに情報が必要な場合は、提供します。ありがとう!

4

1 に答える 1

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

したがって、JSON データをデシリアライズする際に GSon が入力できる Java POJO が 6 つになるはずです。

ここで、JSON 構造を POJO に変換しました。解析を簡素化するために、日付を文字列として指定しました。正しく入力したい場合は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
}

大きな記事

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
于 2012-11-22T12:40:28.243 に答える