一、什么是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);
}
}
}
解析结果:
第二种:GSON解析
添加jar包
点击项目右击打开open Module Settings添加依赖
添加完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());
}
解析结果如下:
第三种解析Fast-json
1.添加jar包到libs目录,点击jar包右击Add As Library
主要代码:
//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());
}
解析结果:
到这,三种方法都成功解析json,是不是感觉json解析Soeasy呢,简单到不想解析
。
总结:无论是XML还是JSON,或者HTML的解析都很简单,我们只要知道解析的原理和技巧就能解析任何的XML,JSON数据了。