Android:解析Json数据

    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来解析,这个暂时不学先。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。