一、什么是JSON?

JSON是JavaScript Object Notation的简称,起源于js(javascript)它是一种轻量级的数据交换格式,JSON不仅在js中广泛使用,同时还在其他领域得到广泛使用,如c,c++,java,Php,swift等等,成为了一种通用的理想数据交换格式,它有两种数据结构,分别是对象,数组,它形式上有花括号{}和中括号[]嵌套,{}中的是代表对象,[]中的为数组,即对象中有数组,数组中又有对象,而且以及键/值对出现


JSON语法:
 json是javascript对象表示语法的子集

  • 数据在键值对中
  • 数据有逗号分隔
  • 花括号保存对象

JSON的值:

  • 数字(整数或浮点数)
  • 字符串(在双引号中
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

json和xml比较:

  • 数据体积小,耗费流量比xml少;
  • 可读性比xml稍差,但格式化后也很直观;
  • 与JavaScript交互比Xml方便;
  • 速度比xml快;
  • 拥有和xml同样多的解析方式。

大概了解了JSON,下面将介绍在Android中解析json这三种常用的方式解析json。


本篇博客使用的json文件如下:(这里是获取网络JSON)people.json,别忘了添加 <uses-permission android:name="android.permission.INTERNET"/>



{
     "sid": "1683",
     "note": "想成就大事,就要从小事开始。",
     "tags": [
         {
             "id": "13",
             "name": "名人名言"
         },
         {
             "id": "16",
             "name": "治愈系"
         }
     ]
 }



第一种JSONArray JSONObject:



代码如下:



public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void parseJson(View view){
      new MyTask().execute();
    }
    class MyTask extends AsyncTask{
        @Override
        protected Object doInBackground(Object[] params) {
            //获取网络Json
            try {
                URL url=new URL("http://192.168.1.110:8080/study.json");
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                //设置请求方式
                connection.setRequestMethod("GET");
                //设置连接超时的时间(优化)
                connection.setConnectTimeout(5000);
                //获取结果码
                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);
                    }
                    Log.i("test",stringBuffer.toString());
                    JSONObject jsonObject=new JSONObject(stringBuffer.toString());
                    int sid=jsonObject.getInt("sid");
                    String note= jsonObject.getString("note");
                    Log.i("test","sid:"+sid+"   note:"+note);
                   JSONArray jsonArray= jsonObject.getJSONArray("tags");
                    for(int i =0;i <jsonArray.length();i++){
                        JSONObject jsonObject1=jsonArray.getJSONObject(i);
                       int id=jsonObject1.getInt("id");
                       String name= jsonObject1.getString("name");
                        Log.i("test","id:"+id+"    name:"+name);
                    }
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
        }
    }
}

解析结果:



android Gson解析oom android解析json文件_android Gson解析oom



第二种:GSON解析

添加jar包


点击项目右击打开open Module Settings添加依赖


android Gson解析oom android解析json文件_ide_02

android Gson解析oom android解析json文件_JSON_03



添加完jar包后,编写实体类:


StudyOne.java


package com.pxd.parsejson;
import java.util.List;
/**
 * Created by Administrator on 2017/2/16.
 */

public class StudyOne {
    private int sid;
    private  String note;
    private List<StudyTwo> tags;
    public StudyOne() {
    }
    public StudyOne(int sid, List<StudyTwo> tags, String note) {
        this.sid = sid;
        this.tags = tags;
        this.note = note;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
    public List<StudyTwo> getTags() {
        return tags;
    }
    public void setTags(List<StudyTwo> tags) {
        this.tags = tags;
    }
}


StudyTwo.java

package com.pxd.parsejson;

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

/**
 * Created by Administrator on 2017/2/16.
 */
public class StudyTwo implements Parcelable{
    private  int id;
    private  String name;
    public StudyTwo() {
    }
    public StudyTwo(String name, int id) {
        this.name = name;
        this.id = id;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(name);
    }
    public static final Creator<StudyTwo> CREATOR = new Creator<StudyTwo>() {
        @Override
        public StudyTwo createFromParcel(Parcel in) {
            StudyTwo studyTwo =new StudyTwo();
            studyTwo.setId(in.readInt());
            studyTwo.setName(in.readString());
            return studyTwo;
        }
        @Override
        public StudyTwo[] newArray(int size) {
            return new StudyTwo[size];
        }
    };

    @Override
    public String toString() {
        return "StudyTwo{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}


重点):

  • 其中属性名称和json数据的键名必须相同
  • 内部类不必是static(亲测)
  • 类属性可以是其他权限修饰符,包括private,并且可以不用写setter和getter(亲测)

代码如下只需把第一种解析方法的代码换成如下代码即可


// 新建Gson对象
      Gson gson=new Gson();
      StudyOne studyOne=gson.fromJson(stringBuffer.toString(),StudyOne.class);
      Log.i("test","sid="+studyOne.getSid()+"  note="+studyOne.getNote());
      List<StudyTwo> studyTwoList =studyOne.getTags();
      for(StudyTwo studyTwo : studyTwoList){
         Log.i("test", studyTwo.toString());
      }


解析结果如下:

android Gson解析oom android解析json文件_json_04


第三种解析Fast-json


1.添加jar包到libs目录,点击jar包右击Add As Library


android Gson解析oom android解析json文件_JSON_05


主要代码:


//03FastJson
                   StudyOne studyOne= JSON.parseObject(stringBuffer.toString(),StudyOne.class);
                    Log.i("test","sid="+studyOne.getSid()+" note="+studyOne.getNote());
                    List<StudyTwo> studyOnes=studyOne.getTags();
                    for (StudyTwo studytwo:studyOnes){
                        Log.i("test",studytwo.toString());
                    }

解析结果:

android Gson解析oom android解析json文件_json_06


到这,三种方法都成功解析json,是不是感觉json解析Soeasy呢,简单到不想解析


总结:无论是XML还是JSON,或者HTML的解析都很简单,我们只要知道解析的原理和技巧就能解析任何的XML,JSON数据了。