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