Android之Gson解析JSON数据

在Android中可以使用Gson解析JSON数据
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 
从结构上看,所有的数据(data)最终都可以分解成三种类型: 
第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。 
第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。 
第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。 
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。 
1) 并列的数据之间用逗号(",")分隔。 
2) 映射用冒号(":")表示。 
3) 并列数据的集合(数组)用方括号("[]")表示。 
4) 映射的集合(对象)用大括号("{}")表示。 
首先,从 code.google.com/p/google-gson/downloads/list下载GsonAPI:
google-gson-1.7.1-release.zip
把gson-1.7.jar copy到libs(项目根目录新建一个libs文件夹)中。
public class MainActivity extends Activity {
    private String jsonData = "[{\"name\":\"zhangsan\",\"age\":22},{\"name\":\"lisi\",\"age\":23}]";
     @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
 
       // 第一种方法,通过把JSON数据映射成一个对象,使用Gson对象的fromJson()方法获取一个对象数组进行操作:
       Type listType = new TypeToken<LinkedList<User>>() {
       }.getType();
 
       Gson gson = new Gson();
       LinkedList<User> users = gson.fromJson(jsonData, listType);
       for (Iterator<User> iterator = users.iterator(); iterator.hasNext();) {
           User user = (User) iterator.next();
           Log.e("wxl", "name111--------->" + user.getName());
           Log.e("wxl", "age111--------->" + user.getAge());
       }
 
       // 第二种方法,通过获取JsonReader对象解析JSON数据:
       JsonReader reader = new JsonReader(new StringReader(jsonData));
       try {
           reader.beginArray();// 开始解析数组
           while (reader.hasNext()) {
              reader.beginObject(); // 开始解析对象
              while (reader.hasNext()) {
                  String tagName = reader.nextName(); // 得到键值对中的key
                  if (tagName.equals("name")) { // key为name时
 
                     Log.i("wxl", "name222--------->" + reader.nextString()); // 得到key中的内容
                  } else if (tagName.equals("age")) { // key为age时
                     Log.i("wxl", "age2222--------->" + reader.nextInt()); // 得到key中的内容
                  }
              }
              reader.endObject();
           }
 
           reader.endArray();
       } catch (IOException e) {
           e.printStackTrace();
       }
 
    }
 
    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;
       }
 
    }
}
 

 

posted @ 2014-02-19 09:44  BetterMan-  阅读(444)  评论(0编辑  收藏  举报