Android 解析Json的方式:底层做法、Gson、FastJson

上一篇博客写了Android如何解析XML,现在我就写写Android是怎么解析Json的。
同样,解析必定是要拿取传过来的数据的,那么Json数据又是怎么样的呢?
Json传过来的数据,要不是就是对象、要不是就是对象数组,而且写法 和XML是不一样的,格式:[] 数组、{} 对象。那我们来看看Json是如何解析的吧.
那么首先和解析XML一样,要获得网络数据,同时因为执行耗时操作也要使用线程间通信机制:假设服务器传过来的数据是一下格式
这里写图片描述
1、子线程+Handler
2、异步任务类AsyncTask
那我们就使用第二个,异步任务类AsyncTask,还要写一个onPostExecute方法

  class MyTask extends AsyncTask{

        @Override
        protected Object doInBackground(Object[] objects) {
            //1、获取网络XML数据
            //URLConnection
            try {
                URL url=new URL("http://192.168.43.81:8080/test.json");
                HttpURLConnection connection=(HttpURLConnection)url.openConnection();
                //设置请求方式
                connection.setRequestMethod("GET");
                //设置请求连接超时的时间(优化)
                connection.setConnectTimeout(5000);
                //结果码(成功:200,失败:404,304,500....)
                int code=connection.getResponseCode();
                if(code==200){
                    //获取服务器返回过来的结果
                    InputStream is=connection.getInputStream();
//                    //打印(读)
                    BufferedReader br=new BufferedReader(new InputStreamReader(is));
                    String str=null;
                    StringBuffer stringBuffer=new StringBuffer();

                    while((str=br.readLine())!=null){
                        stringBuffer.append(str);
                    }
 }

一、原生态做法(JsonArray和JsonObject)

//解析json
                    JSONObject jsonObject=new JSONObject(stringBuffer.toString());
                    int list=jsonObject.getInt("list");
                    Log.i("test","长度:"+list);

                    JSONArray jsonArray=jsonObject.getJSONArray("persons");
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject object=jsonArray.getJSONObject(i);
                        int pid=object.getInt("pid");
                        String pname=object.getString("pname");
                        int page=object.getInt("page");

                        Log.i("test",pid+"    "+pname);
                    }

二、Gson(谷歌),需要导入一个包,点击项目右击,选中Open Module setting,接着点击Dependencies选项卡,找到右上角有一个绿色的加号,点击它选择第一个,在输入框中搜索gson,然后选择它,点击OK,就可以了。
这里写图片描述
这里写图片描述
这里写图片描述

导完后还需要写两个类,Small和Big,也就是我们说的实体类
1、Small

package com.example.parsejson;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by ASUS on 2017/2/18.
 */

public class Small implements Parcelable{
    private int pid;
    private String pname;
    private int page;

    public Small() {
    }

    public Small(int pid, String pname, int page) {
        this.pid = pid;
        this.pname = pname;
        this.page = page;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }


    @Override
    public String toString() {
        return "Small{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", page=" + page +
                '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {

        parcel.writeInt(pid);
        parcel.writeString(pname);
        parcel.writeInt(page);
    }

    public static final Parcelable.Creator<Small> CREATOR=new Parcelable.Creator<Small>(){

        @Override
        public Small createFromParcel(Parcel parcel) {
            Small small=new Small();
            small.setPid(parcel.readInt());
            small.setPname(parcel.readString());
            small.setPage(parcel.readInt());

            return small;
        }

        @Override
        public Small[] newArray(int i) {
            return new Small[i];
        }
    };
}

2、Big

package com.example.parsejson;

import java.util.List;

/**
 * Created by ASUS on 2017/2/18.
 */

public class Big {

    private int list;
    private List<Small> persons;

    public Big() {
    }

    public Big(int list, List<Small> persons) {
        this.list = list;
        this.persons = persons;
    }

    public int getList() {
        return list;
    }

    public void setList(int list) {
        this.list = list;
    }

    public List<Small> getPersons() {
        return persons;
    }

    public void setPersons(List<Small> persons) {
        this.persons = persons;
    }
}

现在就可以解析了

         Gson gson=new Gson();
                    Big big=gson.fromJson(stringBuffer.toString(),Big.class);
                    Log.i("test",big.getList()+"  ");

                    List<Small> persons=big.getPersons();
                    for (Small person:persons) {
                        Log.i("test",person.toString());
                    }

三、FastJson(阿里巴巴),同样作为第三方解析工具,也要导包,直接放入libs下就可以了

                    Big big=JSON.parseObject(stringBuffer.toString(),Big.class);
                    Log.i("test",big.getList()+"  ");

                    List<Small> persons=big.getPersons();
                    for (Small person:persons) {
                        Log.i("test",person.toString());
                    }

到此,不要忘记了加权限

    *<uses-permission android:name="android.permission.INTERNET"></uses-permission>*
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值