JsonArray和Gson

时间:2014-02-04 12:54:30

标签: json gson arrays

我正在使用的JSON库是Gson。我很难制定一个有效的数据类型来表示以下JSON字符串:

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

请帮忙吗?谢谢。

修改

原来我不必要地使事情复杂化,这是按预期工作的:

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的回答,因为他是第一个建议使用另一个类来提供数据的人。

2 个答案:

答案 0 :(得分: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的getter方法名称与约定不同。建议将其命名为get{FieldName}。我已经更新了答案以反映这一点。

答案 1 :(得分: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.
}   

在您的班级LatestOffers中加入以上pojo的列表:

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列表定义。当您将POJO转换为JSON字符串时,它会将您的列表序列化为JsonArray。