使用Gson进行Json解析

使用Gson解析json数据,并分类数据

自带的Json解析真的不好用,碰上大规模的json数据就不行了。

比如:

这里写图片描述

服务器返回的Json看起来就是不爽,用这个吧 就不告诉你

想法

一个API接口返回很多数据,而不同的数据之间有共同性,把有共同之处组合起来放在一起,以备不时之需。

思路
  1. 通过网络的方式,获取现有的API接口来进行测试。感谢干货集中营我用的是其中的 福利

  2. 使用Gson进行解析数据

  3. 使用ArrayList将共同的数据放在一起

实现

1.首先要有一个自定义的线程来去访问网络,获取到json。

mInternetThread
public class MInternetThread extends Thread {

private String finalUrl;
public Handler handler;
public int what;
String content;
ArrayList<String> list;

public MInternetThread(Handler handler, int what, String finalUrl) {
    this.handler = handler;
    this.what = what;
    this.finalUrl = finalUrl;
}

public ArrayList<String> initString(String reString) {
    return new ArrayList<String>();
}

public void getInfo() {
    try {
        URL url = new URL(finalUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStream inputStream = connection.getInputStream();
        byte[] data = new byte[10240];
        int len = 0;
        StringBuffer stringBuffer = new StringBuffer();
        while ((len = inputStream.read(data)) != -1) {
            content = new String(data, 0, len);
            stringBuffer.append(content);
            list = initString(content);
        }
        connection.disconnect();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {
    getInfo();
    Message message = new Message();
    message.what = what;
    message.obj = list;
    handler.sendMessage(message);
}
}

这其中,包含了获取json和handler以及初始化json的方法。初始化json就是把json中具有共性的部分区分开来。

FirstActivity
public class FifstActivity extends Activity {

class client extends MInternetThread {

    public client(Handler handler, int what, String finalUrl) {
        super(handler, what, finalUrl);
    }

    @Override
    public ArrayList<String> initString(String reString) {
        URLData data = new URLData();
        Gson gson = new Gson();
        ArrayList<String> list = new ArrayList<String>();
        Log.e("解析前", reString);
        data = gson.fromJson(reString, URLData.class);
        Log.e("解析后", "" + data);
        for (int i = 0; i < 10; i++) {
            list.add(i, data.results.get(i).url.toString());
        }
        return list;
    }

}

Handler handler = new Handler() {
    public void dispatchMessage(android.os.Message msg) {
        switch (msg.what) {
            case 1:
                Log.e("handle message", "" + msg.obj);
                break;

            case 2:
                break;
        }
    }

    ;
};

public String finalUrl = "http://gank.io/api/data/%E7%A6%8F%E5%88%A9/10/1";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fifst);
    Button btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new client(handler, 1, finalUrl).start();
        }
    });
}
}

所谓把数据分类就那么几行代码。

 for (int i = 0; i < 10; i++) {
      list.add(i, data.results.get(i).url.toString());
 }

因为json里只有10个url,所以只循环10次。

使用Gson解析json 的数据类 URLData
public class URLData {
public String error="";
List<Child> results;
public static class Child{
    public String _id="";
    public String createdAt="";
    public String desc="";
    public String publishedAt="";
    public String source="";
    public String type="";
    public String url="";
    public String used="";
    public String who="";

    }
}
注意
  1. json数据读取的时候可能因为json数据太长,byte数组1024相对来讲比较小。
  2. gson数据类的书写格式一定要对照好
  3. 别忘记加网络访问权限
tip

gson数据类见到 { } 就新建个类,见到 [ ] 就新建一个List。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值