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,也是一步一步解析下去的。
新建一个工具类:
<span style="font-size:14px;">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(); } } } </span>
<span style="font-size:14px;">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); } }); } } </span>
结果:
解析过程:[{"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; } }
新建一个工具类:
<span style="font-size:14px;">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()); } } </span>
<span style="font-size:14px;">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); } }); } } </span>
结果:
实例三:用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来解析,这个暂时不学先。