Android开发-Json解析

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就可以得到整个数据

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

相关推荐