工作点滴之Json解析

peixiaopao 2011-08-13

      Android开发过程中,数据传输是难免的,一般组织数据有两种方式:xml格式和json格式。两者解析都非常方便,而且解析工具也都很多,这里不多作比较。

      下面就Json格式的解析做一个比较实用的分析:

       1) 解析Json格式的数据

       2) 解析单个对象

       3) 解析对象的集合 

一 大前提--什么是Json ?

1.如果不知道什么是Json,先扫一下盲

1)JSON:JavaScript Object Notation

2)  JSON数据是一系列键值对的集合

3)官方网址:www.json.org, 去看看就什么都明白了

2.Json vs xml

1) JSON和XML可读性基本相同

2)JSON和XML通用拥有丰富的解析手段

3)JSON相对XML来讲体积更小

4)JSON与JavaScript的交互性更加方便

5) JSON对数据的描述性相对较差

二 Android 中的JSON解析工具

1.从API level 11 开始(也就是Android3.0),在android.util包下就有了JsonReader 和 JsonWriter两个帮助类,供我们来解析和使用json。

2.Android3.0以下系统的最佳的做法是使用Google的gson类库来解析,其实这也是3.0以后的做法,只是集成了进来,

下载地址:http://code.google.com/p/google-gson/downloads/list

3.下载后的jar文件导入到项目中,我相信这大家都会,下面的例子我采用的是gson来解析。

三 JSON实战

1. 解析json格式的数据

比如说有一个User对象,他有两个属性:name和age,当然实际情况可能有更多的属性,

那么用json格式表示就是:{name:"Ian", age: "20"},我相信你懂的。

1)自定义JSON帮助类--JsonUtils

public class JsonUtils {
	
	public void parseJson(String jsonData) {
		
		try {
			JsonReader reader = new JsonReader(new StringReader(jsonData));
			reader.beginArray();
			while (reader.hasNext()) {
				reader.beginObject();
				while(reader.hasNext()) {
					String tagName = reader.nextName();
					if(tagName.equals("name")) {
						System.out.println("name--->" + reader.nextString());
					} else if(tagName.equals("age")) {
						System.out.println("age--->" + reader.nextString());
					}
				}
				reader.endObject();
			}
			reader.endArray();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
 

2) Activity代码

public class MainActivity extends Activity {
    private Button btnStart;
    private String jsonDataUser = "{\"name\":\"Ian\",\"age\":20}";


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnStart = (Button)findViewById(R.id.btnStart);
        btnStart.setOnClickListener(new BtnStartSetOnClickListener());
        
        
    }
    
    private class BtnStartSetOnClickListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			JsonUtils jsonUtils = new JsonUtils();
			jsonUtils.parseJson(jsonData);
		}
    }
}

 就这么几行代码,在Console上就可以看到解析输出的信息了,是不是很简单呢?

2. 解析对象

1)上面解析的是字符串形式,如果我们定义一个User对象会怎么样呢?

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;
	}
}
 

2) 解析方法

public void parseUserFromJson(String jsonData) {
	
	Gson gson =new Gson();
	User user = gson.fromJson(jsonData, User.class);
	System.out.println("name---------->" + user.getName());
	System.out.println("age---------->" + user.getAge());   
	
}
 

是不是更简单了呢?

3. 解析集合

1)如果不是单个User,而是ArrayList<User>,那么该怎么解析啊,因为这个太常见了。

要解决这个问题,得先弄明白集合用json该怎么表示,简单来讲“{}”表示一个对象,“[]”表示一个集合,集合里面可以有多个对象,这样表示[{},{},{}]。OK,那么看实战代码,

json数据:

private String jsonDataUsers = "[{\"name\":\"Jack\",\"age\":20},{\"name\":\"Tom\",\"age\":22},{\"name\":\"Ian\",\"age\":20}]";

 解析代码:

public void parseUserFromJson(String jsonData) {

		Type typeList = new TypeToken<ArrayList<User>>(){}.getType();
		Gson gson = new Gson();
		LinkedList<User> users = gson.fromJson(jsonData, typeList);
		for(Iterator<User> iterator = users.iterator(); iterator.hasNext();) {
			User user = iterator.next();
			System.out.println("name---------->" + user.getName());
			System.out.println("age---------->" + user.getAge());
		}
	}
 

我们可以看到,只是多了一行“Type typeList = new TypeToken<ArrayList<User>>(){}.getType();”,就可以解析出List来,然后迭代List就可以得到整个数据

了,真的很方便,还等什么呢,赶快试试看吧!

相关推荐

大树 / 0评论 2011-09-29