ztgreenleaves 2012-01-10
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就可以得到整个数据
了,真的很方便,还等什么呢,赶快试试看吧!