JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,访问服务器时返回的数据常常是HTML、XML和JSON,这时我们需要去解析这些数据。JSON有两种结构、一是对象,二是数组。前者数据格式为 {key:value,key:value,...};后者数据格式为:["java","javascript","vb",...],当然数组里面也可以是对象。
实例一:用SDK的类库来解析JSON数据,最重要的一个类是JsonReader,他的构造方法是public JsonReader (Reader in);其中比较重要的方法是beginArray()、beginObject()、hasNext()、nextString(),nextInt()等、还有就是最后的end和close方法。感觉有点像SAX和PULL解析XML,也是一步一步解析下去的。
新建一个工具类:
package com.example.jsondemo;
import java.io.IOException;
import java.io.StringReader;
import android.util.JsonReader;
public class JsonUtils {
public static void parseJson(String jsonData) {
JsonReader reader = new JsonReader(new StringReader(jsonData)); //实例化一个JsonReader对象
try {
reader.beginArray(); //开始解析数组
while (reader.hasNext()) { //如果当前数组或对象存在元素则返回真
reader.beginObject(); //开始解析对象
while (reader.hasNext()) {
String tagName = reader.nextName(); //将解析到的数据打印出来
if (tagName.equals("name")) {
System.out.println("-->>" + reader.nextString());
} else if (tagName.equals("age")) {
System.out.println("-->>" + reader.nextInt());
}
}
reader.endObject(); //解析完一个对象
}
reader.endArray(); //解析完数组
reader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.example.jsondemo;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
// [{\"name\":\"leelit\",\"age\":20},{\"name\":\"lina\",\"age\":21}] 模拟服务器返回的Json数据
private String jsonData = "[{\"name\":\"leelit\",\"age\":20},{\"name\":\"lina\",\"age\":21}]"; //这里的/是转义字符
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
System.out.println("Begin to parse Json");
JsonUtils.parseJson(jsonData);
}
});
}
}
结果:
解析过程:[{"name":"leelit","age":20},{"name":"lina","age":21}] 。开始解析数组 → 解析第一个对象 → tagName = "name",打印出leelit → 第一个对象还有元素,返回真 → tagName = "age",打印出20 → 解析完第一个对象,还有第二个对象,返回真,又开始解析第二个对象,以此类推。
实例二:用GSON来解析含一个对象的JSON数据,其实就是将JSON数据转化为Java对象。首先下载一个GSON类库点击打开链接;然后将其导入工程当中:jar文件放入libs文件夹,然后右击bulid path,最后add path就可以使用这个GSON类库了。
新建一个User类:
package com.example.jsondemo;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
新建一个工具类:
package com.example.jsondemo;
import java.io.StringReader;
import com.google.gson.Gson;
import android.util.JsonReader;
public class JsonUtils {
public static void parseJson(String jsonData) {
Gson gson = new Gson(); //实例化一个GSON对象
User user = gson.fromJson(jsonData, User.class); //功过gson,将JSON数据转化为一个JavaBean对象。
System.out.println("-->> " + user.getName() + " " + user.getAge());
}
}
package com.example.jsondemo;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
// {"name":"leelit","age":20};
private String jsonData = "{\"name\":\"leelit\",\"age\":20}";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
System.out.println("Begin to parse Json");
JsonUtils.parseJson(jsonData);
}
});
}
}
结果:
实例三:用GSON来解析数组JSON数据
新建一个User类
新建一个工具类
package com.example.jsondemo;
import java.lang.reflect.Type;
import java.util.Iterator;
import java.util.LinkedList;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class JsonUtils {
public static void parseJson(String jsonData) {
Type listType = new TypeToken<LinkedList<User>>() {
}.getType();
Gson gson = new Gson();
LinkedList<User> users = gson.fromJson(jsonData, listType); //将Json数据转化为一个LinkedList对象
for (User user : users) {
System.out.println("-->> " + user.getName() + " " + user.getAge());
}
}
}
package com.example.jsondemo;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
// [{\"name\":\"leelit\",\"age\":20},{\"name\":\"lina\",\"age\":21}]
private String jsonData = "[{\"name\":\"leelit\",\"age\":20},{\"name\":\"lina\",\"age\":21}]";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
System.out.println("Begin to parse Json");
JsonUtils.parseJson(jsonData);
}
});
}
}
结果:
小结:熟悉JsonReader和Gson这个两个类就可以了。看视频教程很多都是自己做的服务器,然后返回数据再自己去解析,这样应该更深刻,不过现在还不会服务器这块。另外还知道的一个方法是用FastJson来解析,这个暂时不学先。