网络传输文本数据格式JSON

下面我们就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.     StringRequest str_req=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.     str_req.setTag("getvolley_str");//设置标签,方便退出Activity时结束这个网络请求  
  16.     Application_Volley.gethttp().add(str_req);//添加到全局队列<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.     JsonObjectRequest jsonobj_req=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.     jsonobj_req.setTag("getvolley_jsonobj");//设置标签,方便退出Activity时结束这个网络请求  
  17.     Application_Volley.gethttp().add(jsonobj_req);//添加到全局队列  
  18. }  
c. JsonArrayRequest是[]包裹起来的一个数组(Array)[{},{}]
[java]  view plain copy print ?
  1. private void getvolley() {  
  2. //      3.JsonArrayRequest  
  3.         //创建JsonArrayRequest网络请求  
  4.         JsonArrayRequest jsonarr_req=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.         jsonarr_req.setTag("getvolley_jsonarr");//设置标签,方便退出Activity时结束这个网络请求  
  16.         Application_Volley.gethttp().add(jsonarr_req);//添加到全局队列  
  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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值