java

Json海量数据解析

2017-03-28  本文已影响482人  第八区

Json海量数据解析

前言

​ 在android开发中,app和服务器进行数据传输时大多数会用到json。在解析json中通常会用到以下几种主流的解析库:jackson、gson、fastjson。而对于从server端获取的数据量很小时候,我们可能会忽略解析所产生的性能问题。而我在开发的过程中就碰到因为解析json而产生严重的问题。

问题场景

先描述以下问题的场景:app做收银库存管理。这时候每次登陆时候会去服务端同步所有的商品、分类等数据。而这时候,当商品的数量很大的时候,客户端拿到数据时候对app来说还是比较大的。而server端是将所有的数据序列化为json字符串存入到文件,然后app去下载文件并进行解析。下面说下我的修改历程。

踩坑过程

​ 上面是我一步步走过得坑,唉。可能对于看过fastjson源码的童鞋来说so easy。但第一次碰到后,坑还是得一步步的踩。当然也是要不断的通过看源码、写测试代码、比较内存和时间。下面是我做的一些测试。

测试验证

准备工作
结果分析
List<Good> list = new Gson().fromJson(new InputStreamReader(getAssets().open("goods.json"),     
            "UTF-8"), new TypeToken<List<Good>>() {}.getType());
1.png

使用流进行读取。内存也是不断被消耗。三次解析时间为 33,394ms 31,632ms 32,378ms

JSONReader reader = new JSONReader(new InputStreamReader(getAssets().open("goods.json"),
            "UTF-8"));
reader.startArray();
while (reader.hasNext()) {
    Good good = reader.readObject(Good.class);
}
reader.endArray();
reader.close();
reader = null;
2.png
JSONReader reader = new JSONReader(new InputStreamReader(getAssets().open("goods.json"),
           "UTF-8"));
reader.startArray();
while (reader.hasNext()) {
    reader.startObject();
    Good good = new Good();
    while (reader.hasNext()) {
        String key = reader.readString();
        if ("id".equals(key)) {
                good.setId(reader.readString());
            } else if ("name".equals(key)) {
                good.setName(reader.readString());
            } else if ("price".equals(key)) {
                good.setPrice(Double.parseDouble(reader.readString()));
            } else if ("barCode".equals(key)) {
                 good.setBarCode(reader.readString());
            } else if ("desc".equals(key)) {
                 good.setDesc(reader.readString());
            } else if ("count".equals(key)) {
                 good.setCount(Integer.parseInt(reader.readString()));
            } else {
                 reader.readObject();
            }   
        }
    reader.endObject();
    }
reader.endArray();
reader.close();
reader = null;
3.png

最后我们对比消耗时间

5.png

其他

public class Good {
  private String id;
  private String name;
  private double price;
  private String barCode;
  private String desc;
  private int count;
  public Good() {
  }
  public Good(String id, String name, double price, String barCode, String desc, int count) {
      this.id = id;
      this.name = name;
      this.price = price;
      this.barCode = barCode;
      this.desc = desc;
      this.count = count;
  }
  public String getId() {
      return id;
  }
  public void setId(String id) {
      this.id = id;
  }
  public String getName() {
      return name;
  }
  public void setName(String name) {
      this.name = name;
  }
  public double getPrice() {
      return price;
  }
  public void setPrice(double price) {
      this.price = price;
  }
  public String getBarCode() {
      return barCode;
  }
  public void setBarCode(String barCode) {
      this.barCode = barCode;
  }
  public String getDesc() {
      return desc;
  }
  public void setDesc(String desc) {
      this.desc = desc;
  }
  public int getCount() {
      return count;
  }
  public void setCount(int count) {
      this.count = count;
  }
  @Override
  public String toString() {
      return "Good{" +
              "id='" + id + '\'' +
              ", name='" + name + '\'' +
              ", price=" + price +
              ", barCode='" + barCode + '\'' +
              ", desc='" + desc + '\'' +
              ", count=" + count +
              '}';
  }
}
上一篇下一篇

猜你喜欢

热点阅读