您的位置:首页 > 移动开发 > Android开发

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

2017-02-18 19:07 387 查看
上一篇博客写了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=" + p
4000
id +
", 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>*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: