2014-02-04 4 views
0

Библиотека JSON, которую я использую, - это Gson. У меня возникают трудности формулирования типа данных функционирующую представлять следующую строку JSON:JsonArray и Gson

{ 
    "latestoffers": [ 
     { 
     "id": "4qXleunwNMCKi8M0q0CuMa", 
     "price": "534.99", 
     "firstrecorded_at": 1377808800, 
     "lastrecorded_at": 1382862800, 
     "seller": "Newegg", 
     "availability": "In stock. [BBX: Buy Box]", 
     "currency": "USD" 
     }, 
     { 
     "id": "4xTIQAPySG68IS0CGyOuyO", 
     "price": "582.41", 
     "firstrecorded_at": 1380725000, 
     "lastrecorded_at": 1382862800, 
     "seller": "Beach Audio", 
     "currency": "USD" 
     }, 
     { 
     "id": "5nW67R2V4CwmE8cwaWsawe", 
     "price": "578.04", 
     "firstrecorded_at": 1379524200, 
     "lastrecorded_at": 1379998900, 
     "seller": "Beach Audio", 
     "currency": "USD" 
     } 
     ], 
    "offers_count": 6, 
    "name": "newegg.com", 
    "recentoffers_count": 2, 
    "sku": "N82E16834216463", 
    "url": "http://www.newegg.com/Product/Product.aspx?Item=N82E16834216463" 
} 

Мой класс данных (до сих пор) выглядит следующим образом, это метод getOfferData(), что я не как закончить. Я также не уверен, является ли JsonArray подходящим элементом JSON для использования?

static class LatestOffers { 

    Integer offers_count; 
    String name; 
    Integer recentoffers_count; 
    String sku; 
    String url; 

    java.util.List<JsonArray> getOfferData() { 

     List<JsonArray> list = new ArrayList<JsonArray>(); 
     // how do I get parse the 'id', 'price', 'firstrecorded_at' etc. to add them to the ArrayList? 
      return list; 
    } 

    Integer getOffers_count() { 
     return offers_count; 
    } 

    String getName() { 
     return name; 
    } 

    Integer getRecentoffers_count() { 
     return recentoffers_count; 
    } 

    String getSku() { 
     return sku; 
    } 

    String getUrl() { 
     return url; 
    } 
} 

Любая помощь, пожалуйста? Спасибо.

EDIT

Оказывается, я был излишне усложнять, это работает как задумано:

static class LatestOffers { 
     List<Offer> latestoffers; 

     List<Offer> getOffer() { 
      return latestoffers; 
     } 
    } 

    static class Offer { 

     private String id; 
     private String price; 
     private long firstrecorded_at; 
     private long lastrecorded_at; 
     private String seller; 
     private String availability; 
     private String currency; 

     String getId() { 
      return id; 
     } 

     String getPrice() { 
      return price; 
     } 

     long getFirstrecorded_at() { 
      return firstrecorded_at; 
     } 

     long getLastrecorded_at() { 
      return lastrecorded_at; 
     } 

     String getSeller() { 
      return seller; 
     } 

     String getAvailability() { 
      return availability; 
     } 

     String getCurrency() { 
      return currency; 
     } 

    } 

Спасибо всем, кто ответил, я принимая ответ user2762451 как (s) он первым предложил использовать другой класс для данных Предложения.

ответ

0

Я бы посоветовал вам создать новый POJO для объекта в массиве.

class Offer { 
    private String id; 
    private String price; 
    private long firstRecordedAt; 
    private long lastRecordedAt; 
    private String seller; 
    private String availability; 
    private String currency; 

}

И ваш LatestOffers класс может иметь List<Offer> offers; и метод getOfferData() должен возвращать List<Offer>.

В основном, следующие:

static class LatestOfferDetail { 
    private int offersCount; 
    private String name; 
    private int recentOffersCount; 
    private String sku; 
    private String url; 
    private List<Offer> latestOffers = new ArrayList<Offer>(); 

    //other getters and setters 
    public List<Offer> getLatestOffers() { 
     return latestOffers; 
    } 
} 

Кроме того, вы, кажется, после многократного именования в одной и той же части кода и JSON. С JAVA рекомендуется следовать CamelCaseNaming. Я обновил ответ, чтобы отразить это.

Кроме того, ваш метод получения по умолчанию для latestOffers имеет имя, отличное от соглашения. Целесообразно назвать его get{FieldName}. Я обновил ответ, чтобы отразить это.

+0

Спасибо за это, user2762451. Я понимаю, что до сих пор проблема для меня заключается в том, как разбирать JSON, чтобы получить идентификатор, цену, firstRecordedAt и т. Д. - суть в том, что (в отличие от sku, url и т. Д.) Нет ключевого значения, которое я могу использовать получить предложение? –

+0

@ClivevanHilten 'latestOffers' - это список, эффективно элементы массива и массива в JSON не будут иметь« ключ »как таковой. что вы точно хотите сделать, когда говорите, «ключевое значение, которое я могу использовать для извлечения предложения»? – aasu

+0

Я не знаю, как получить массивы, содержащие id, price, firstRecordedAt и т. Д., Чтобы добавить их в список? –

0

Создать другой POJO содержат все использование параметра в массиве, как показано ниже:

public class MyOffer 
{ 
    private String id; 
    private double price; 
    private long firstrecorded_at; 
    private long lastrecorded_at; 
    private String seller; 
    private String availability; 
    private String currency; 

    //your getter and setter methods here. 
} 

Включить список выше POJO в классе LatestOffers:

List<MyOffer> latestoffers = new ArrayList<MyOffer>();  

ваш класс LatestOffers выглядеть как этот

static class LatestOffers 
{ 
    Integer offers_count; 
    String name; 
    Integer recentoffers_count; 
    String sku; 
    String url; 

    List<MyOffer> latestoffers = new ArrayList<MyOffer>(); 

    //getter and setter method 
} 

Основной класс для испытания:

public static void main(String[] args) { 
    LatestOffers lso = new LatestOffers(); 
    lso.setName("N82E16834216463"); 
    lso.setOffers_count(6); 
    lso.setRecentoffers_count(2); 
    lso.setSku("N82E16834216463"); 
    lso.setUrl("http://www.newegg.com/Product/Product.aspx?Item=N82E16834216463"); 
    MyOffer offer = null; 
    List<MyOffer> list = new ArrayList<MyOffer>(); 
    for(int i=0;i<2;i++){ 
     offer = new MyOffer(); 
     offer.setAvailability("In stock. [BBX: Buy Box]"); 
     offer.setCurrency("USD"); 
     offer.setFirstrecorded_at(1377808800); 
     offer.setId("4qXleunwNMCKi8M0q0CuMa"); 
     offer.setLastrecorded_at(1382862800); 
     offer.setPrice(534.99); 
     offer.setSeller("Newegg"); 

     list.add(offer); 
    } 
    lso.setLatestoffers(list); 
    Gson gson = new Gson(); 
    String json = gson.toJson(lso); 
    System.out.println(json); 

} 

Выход:

{ 
    "offers_count": 6, 
    "name": "N82E16834216463", 
    "recentoffers_count": 2, 
    "sku": "N82E16834216463", 
    "url": "http://www.newegg.com/Product/Product.aspx?Item=N82E16834216463", 
    "latestoffers": [ 
    { 
     "id": "4qXleunwNMCKi8M0q0CuMa", 
     "price": 534.99, 
     "firstrecorded_at": 1377808800, 
     "lastrecorded_at": 1382862800, 
     "seller": "Newegg", 
     "availability": "In stock. [BBX: Buy Box]", 
     "currency": "USD" 
    }, 
    { 
     "id": "4qXleunwNMCKi8M0q0CuMa", 
     "price": 534.99, 
     "firstrecorded_at": 1377808800, 
     "lastrecorded_at": 1382862800, 
     "seller": "Newegg", 
     "availability": "In stock. [BBX: Buy Box]", 
     "currency": "USD" 
    } 
    ] 
} 

нет необходимости определять getOfferData() метод просто создать список MyOffer класса и установить этот список в список latestoffers определить в классе LatestOffers.Он преобразует ваш список в JsonArray, когда вы конвертируете POJO в JSON String.

+0

Спасибо за этот Ягнеш. Могли бы вы, возможно, обновить свой ответ, чтобы включить код, охватывающий вашу точку? Он будет сериализовать ваш список в JsonArray, когда вы конвертируете POJO в JSON String? Это то, что я пытаюсь понять. –

+0

Он преобразует ваш список в массив внутри строки JSON. –

+0

Извините, я не понимаю ответа на мой комментарий. Если у вас есть момент, код (или даже псевдокод) будет очень полезен, поэтому я могу понять :-) –

Смежные вопросы