2012-11-19 17 views
7

Sto cercando di analizzare un JSON con la libreria GSON sulla mia app Android. Potrei analizzare correttamente un array JSON, ma ora ho bisogno di analizzare un'altra JSON, con questo estructure:Tentativo di analizzare JSON con GSON

{ 
    "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; 
    } 
} 

E un 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; 
} 

}

E, il mio principale attività cerco di ottenere tutte le informazioni whith questo:

final Gson gson = new Gson(); 
    Order o = gson.fromJson(jsonData, Order.class); 
    System.out.println(" - " + o.getOrderId()); 

E funziona bene, ma se voglio ottenere articoli informazioni, VA i lues sono nulli e non so come posso ottenerlo.

provo con qualcosa di simile:

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

e cerco di usare un ArticlesWrapper, ma non so come farlo esattamente. Ma penso di aver dimenticato qualcosa ... e non so cosa. In un'altra parte dell'app, ho deserializzato correttamente un JSON perché è un array, ma in questo caso non so come posso ottenere tutti i dati correttamente.

Se avete bisogno di ulteriori informazioni, vi fornirò !. Grazie!

risposta

12

Questo perché non si sta traducendo correttamente la struttura JSON in POJO Java, in pratica omettendo alcuni campi si ha la seguente struttura.

+ 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 

Così si dovrebbe finire con 6 POJO Java che GSON dovrebbe essere in grado di popolare durante la deserializzazione i dati JSON.

Ho appena tradotto la struttura JSON in POJO qui e ho lasciato Dates as String per semplificare l'analisi. Se vuoi che lo java.util.Date sia popolato correttamente dovrai personalizzare l'istanza di GSon.

Classe principale

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()); 
    } 
} 

Ordinare

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 
} 

Articolo

public class Article { 
    private int articleId; 
    private String articleName; 
    private int merchantId; 
    private double price; 

    // getters and setters 
} 

clienti

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 
} 

dispositivo

public class Device { 
    private int customerId; 
    private String deviceId; 
    private String phone; 

    // getters and setters 
} 

Località

public class Location { 
    private String location; 
    private int locationId; 
    private int shopId; 

    // getters and setters 
} 

uscita

orderId: 203 
first article price: 3.5 
second article status: AS01_INITIAL 
third article requested date: 2012-11-19 13:15:20 
+0

Ciao Alex, grazie mille per la risposta. Non ho avuto abbastanza tempo per provare, ma se lavori ti darei tutta la mia reputazione !! Grazie ancora. – Pipeline

+9

Alex è stato abbastanza coraggioso da fare il tuo lavoro: P – shkschneider

Problemi correlati