下面我们就volley框架为例,讲讲json的使用与解析。

1.json是什么?为什么不使用xml?

json是一种轻量级的数据交换格式

格式:JSON 的书写格式是:名称/值对--例如:"username":"1011"

结构:在volley中有三种格式的数据可以传输,其中有一个就是String,其他两个就是json的两种书写格式

对象结构:使用{ };数组结构[];

完整事例一:

{"username":"1011","password":"123"}
二:{"information":{"username":"1011","password":"123"},"age":"21"}
三:{"person":[{"information1":{"username":"1011","password":"123"},"age1":"21"},{"information2":{"username":"1011","password":"123"},"age2":"21"}],"count":[{},{}]}

为什么不使用xml:

xml:安卓布局就是xml

例:

android:id="@+id/volley_image"
         android:layout_width="100dp"
         android:layout_height="100dp"

json:JSON更为清晰且冗余更少些。JSON语法的有严格描述,只是描述较简短。从总体来看,XML比较适合于标记 文档,而JSON却更适于进行数据交换处理


使用JSON作为传输格式的优势:

1、格式简单,易于读写,格式经过压缩,带宽占用小,体积小,省流量

2、易于解析,客户端JavaScript可以直接通过eval()进行JSON数据的读取;

3、扩展性好,在javascript中有着XML无法比拟的绝对优势;

4、支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby等语言服务器端语言,并都有相应的解析工具或包,便于服务器端的解析;

5、简化了服务器端和客户端的代码开发量,因为JSON格式能够直接为服务器端或客户端代码使用,而不需要再进行解析,这样就提高了开发速度和易于维护。

6、在目前比较流行的Ajax框架中,都支持并推荐使用JSON格式,并且在Web Service中也在逐步推广。

缺点:

1、  推广力度不够强,使用还不够广泛,通用性不是很强;语义性差,看起来不如XML直观

2、  相关资料相对而言比较少;

3、  JSON格式目前在Web Service中推广还属于初级阶段。



2.volley的三个文本数据交换类获取(StringRequest、JsonObjectRequest、JsonArrayRequest)

JSONObject是一个{}包裹起来的一个对象(Object),
而JSONArray则是[]包裹起来的一个数组(Array),
a.StringRequest,只是由于获取一个String的方法类


[java]  view plain copy print ?

    1. private void getvolley() {  
    2. /       1.StringRequest  
    3. //创建StringRequest网络请求  
    4. new StringRequest(Method.GET, get_url,new Listener<String>() {  
    5. @Override  
    6. public void onResponse(String arg0) {  
    7. // TODO Auto-generated method stub  
    8.         }  
    9. new ErrorListener() {  
    10. @Override  
    11. public void onErrorResponse(VolleyError arg0) {  
    12. // TODO Auto-generated method stub  
    13.         }  
    14.     });  
    15. "getvolley_str");//设置标签,方便退出Activity时结束这个网络请求  
    16. //添加到全局队列<span style="font-family: 宋体; white-space: pre-wrap;">}</span>


    b.JsonObjectRequest是传输{}包裹起来的一个对象(Object),{"username":"1011","password":"123"}



    [java]  view plain copy print ?

    1. private void getvolley() {  
    2. /       2.JsonObjectRequest  
    3. //创建JsonObjectRequest网络请求  
    4. new JsonObjectRequest(Method.GET, get_url,   
    5. null,new Listener<JSONObject>() {  
    6. @Override  
    7. public void onResponse(JSONObject arg0) {  
    8. // TODO Auto-generated method stub  
    9.         }  
    10. new ErrorListener() {  
    11. @Override  
    12. public void onErrorResponse(VolleyError arg0) {  
    13. // TODO Auto-generated method stub  
    14.         }  
    15.     });  
    16. "getvolley_jsonobj");//设置标签,方便退出Activity时结束这个网络请求  
    17. //添加到全局队列  
    18. }


    c.

    JsonArrayRequest是[]包裹起来的一个数组(Array)[{},{}]

    [java]  view plain copy print ?

    1. private void getvolley() {  
    2. //      3.JsonArrayRequest  
    3. //创建JsonArrayRequest网络请求  
    4. new JsonArrayRequest(get_url, new Listener<JSONArray>() {  
    5. @Override  
    6. public void onResponse(JSONArray arg0) {  
    7. // TODO Auto-generated method stub    
    8.             }  
    9. new ErrorListener() {  
    10. @Override  
    11. public void onErrorResponse(VolleyError arg0) {  
    12. // TODO Auto-generated method stub  
    13.             }  
    14.         });  
    15. "getvolley_jsonarr");//设置标签,方便退出Activity时结束这个网络请求  
    16. //添加到全局队列  
    17.     }


    JSON有两种解析方式:JsonObject和Gson

    private void parseJSONWithJsonObject(String json){
            try {
                JSONArray array=new JSONArray(json);
                for (int i=0;i<array.length();i++){
                    JSONObject obj=array.getJSONObject(i);
                    String id=obj.getString("id");
                    String name=obj.getString("name");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


    假设返回的是一个json数组,则得到服务器的返回数据后,首先将返回数据传入一个JsonArray,然后循环遍历整个array,从中取得的每一个元素都是一个JsonObject,在调用getString将数据取出。



    private void parseJSONWithGson(String json){
            Gson gson=new Gson();
            List<Person> list=gson.fromJson(json,new TypeToken<List<Person>>(){}.getType());
            for (Person person:list){
                Log.d("Activity",person.getId());
                Log.d("Activity",person.getName());
            }
        }


    定义一个Person类,有id和name两个字段,并有setter和getter方法。

    如果需要解析的是JSON数据直接Person person=gson.fromJson(json,Person.class);

    如果需要解析的是数组,则要借助TypeToken将期望解析成的数据类型传入fromJson:List<Person> list=gson.fromJson(json,new TypeToken<List<Person>>(){}.getType());再foreach遍历list