zoukankan      html  css  js  c++  java
  • Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容:

    1.使用Volley实现异步加载Json数据...

      Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后对对象进行解析,从而获取Json数据,另一种方式则是通过获取JsonArray的方式来对Json数据进行解析,其实就是Json数组...由于Json数据格式的不同,因此也就有了这两种方式...

      因此实现类也就成为了两个JsonObjectRequest.java和JsonArrayRequest.java,他们都 extends JsonRequest,而JsonRequest继承了Request类,重写了其中内部的一些方法...因为获取Json对象,提交这个请求已经是一个确定好的类型,因此需要对父类中的一些方式进行重写...Request只是为更多的请求方式提供了一个父类,其他类型的请求,需要使用新的类进行继承,重写,然后子类再充当父类,用新的子类进行继承和重写...从而实现了良好的扩展....

      那么JsonRequest为什么没有实现parseNetWorkResponse想必也就不用说了,对外提供接口,方便扩展和实现...

      我们先看看第一种,使用Volley获取JsonObject,从而解析获取Json数据...

    1.JsonObjectRequest.java

      这里的源码就非常的简单了,没什么太多可说的...关键还是看如何调用...

    package com.android.volley.toolbox;
    
    import com.android.volley.NetworkResponse;
    import com.android.volley.ParseError;
    import com.android.volley.Response;
    import com.android.volley.Response.ErrorListener;
    import com.android.volley.Response.Listener;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.UnsupportedEncodingException;
    
    public class JsonObjectRequest extends JsonRequest<JSONObject> {
        //指定提交方式和url来创建一个请求对象...
        public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
                Listener<JSONObject> listener, ErrorListener errorListener) {
            super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
                        errorListener);
        }
    
        //通过url的形式来建立一个请求对象...
        public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener,
                ErrorListener errorListener) {
            this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest,
                    listener, errorListener);
        }
    
        @Override
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString =
                    new String(response.data, HttpHeaderParser.parseCharset(response.headers)); //按照指定字符集解析..
                return Response.success(new JSONObject(jsonString),//返回成功数据...
                        HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
            }
        }
    }

      调用的方式我们还是通过例子来完成...这里我们通过请求来获取Json数据...

      http://192.168.199.172:8080/JSP/Json_1.txt是这个样子的...简单的Json数据...

    {
         "user":[
         {"userid":"1","username":"darker","userpassword":"49681888"},
             {"userid":"2","username":"darker_1","userpassword":"49681888"},
             {"userid":"3","username":"darker_2","userpassword":"49681888"}
          ]
     }

       下面通过请求完成调用,获取其中的内容...

    package com.example.oop;
    import com.android.volley.RequestQueue;
    import com.android.volley.toolbox.Volley;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
        }
        
        public void init(){
            RequestQueue queue=Volley.newRequestQueue(MainActivity.this);
            //这里没有重写错误方法...正常来说是需要重写的...
            mqueue.add(new JsonObjectRequest(Method.GET,"http://192.168.199.172:8080/JSP/Json_1.txt",url,new Listener<JSONObject>(){
            @Override
            public void Response(JSONObject response){
                //这里我们可以看到我们获取的就是JsonObject了...我们可以在这里进行解析,从而获取想要的数据...
            List<HasnMap<String,String>>list=new ArrayList<HashMap<String,String>>();
            String s[]=new String[]{"userid","username","userpassword"};
            try{
               JSONArray array=response.getJSONArray("user");
            for(int i=0;i<array.size();i++){
                JSONObject object=array.opt(i);
                Map<String,String>map=new HashMap<String,String>();
                for(String str:s){
                    map.put(str,object.get(str));
                }
                list.add(map);
                 for(int i=0;i<list.size();i++){
                    for(int j=0;j<Json_id.length;j++){
                        System.out.println(list.get(i).get(Json_id[j]));
                    }
                }
            }
         }catch(Exception e){}
            }
        }));
    
        }
        
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }

      通过Json对象,来解析Json数据的方式其实有很多种方式,这里我只列举了一个,通过把JsonObject转化成JsonArray的形式,然后对数组进行遍历,从而获取每一个数据信息...更多的方式我在博客中也进行了书写,大家可以去看看Android学习笔记之Json的使用...这是第一种通过获取JsonObject从而获取Json数据信息的...

      第二种方式:

    2.JsonArrayRequest.java

      源码也就这点玩意...不是很难理解...

    package com.android.volley.toolbox;
    
    import com.android.volley.NetworkResponse;
    import com.android.volley.ParseError;
    import com.android.volley.Response;
    import com.android.volley.Response.ErrorListener;
    import com.android.volley.Response.Listener;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    
    import java.io.UnsupportedEncodingException;
    
    
    public class JsonArrayRequest extends JsonRequest<JSONArray> {
    
        //这里只有一种方式,直接通过url来建立一个JsonArray请求对象...
        public JsonArrayRequest(String url, Listener<JSONArray> listener, ErrorListener errorListener) {
            super(Method.GET, url, null, listener, errorListener);
        }
    
        @Override
        protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString =
                    new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                return Response.success(new JSONArray(jsonString),
                        HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
            }
        }
    }

      看一下具体的调用过程...

      http://192.168.199.172:8080/JSP/JSON.txt的数据信息如下..

    [
        {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
        {"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
        {"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
    ]
     

      主函数的调用过程...有一些包没有引入,到时候书写时编译器会自动引入的...

    package com.example.oop;
    
    
    import com.android.volley.RequestQueue;
    import com.android.volley.toolbox.Volley;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    
    public class MainActivity extends Activity{
    
            String url="http://192.168.199.172:8080/JSP/JSON.txt";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
        }
        
        public void init(){
            RequestQueue queue=Volley.newRequestQueue(MainActivity.this);
            mqueue.add(new JsonArrayRequest(url, new Listener<JSONArray>() {
        @Override
        public void OnResponse(JsonArray response){
            //TODO Auto-generated method stub
            try{
                for(int i=0;i<response.length;i++){
                    JsonObject object=(JsonObject)response.opt(i);
                     Map<String,Object>map=new HashMap<String,Object>();
                    for(String str:s){
                        map.put(str,object.get(str));
                    }
                    list.add(map);
                }
                for(int i=0;i<list.size();i++){
                    for(int j=0;j<s.length;j++){
                        System.out.println(list.get(i).get(s[j]));
                    }
                }
            }catch(Exception e){}
        }
    }, new ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error){
            //TODO Auto-generated method stub
            System.out.println(error.toString());
        }
    }));
    
        }
        
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }

      这里当请求成功之后,获取到的响应就是JsonArray对象了...然后通过遍历就直接能够获取到JsonArray里保存的数据信息了...这就是解析的另一种方式...直接获取Json数组...从而获取数据信息...

      JsonArrayRequest方式和JsonObjectRequest方式模式基本是相同的...只是对Json的数据格式要求并不一样...只需在Json的格式上发生以下简单的变化...

      JsonArrayRequest请求的Json数据格式[{},{}]...返回的形式是Json数组..

      JsonObjectRequest请求的Json数据格式["名称":[{},{}]]...返回的形式是Json对象..

      这样就完成了Json数据的获取+解析..获取过程由Volley实现,解析由我们去实现...

    最后我们来看一下父类的源代码...

    3.JsonRequest.java

      源代码其实也非常的简单...

    package com.android.volley.toolbox;
    
    import com.android.volley.NetworkResponse;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.Response.ErrorListener;
    import com.android.volley.Response.Listener;
    import com.android.volley.VolleyLog;
    
    import java.io.UnsupportedEncodingException;
    
    public abstract class JsonRequest<T> extends Request<T> {
        /** Charset for request. */
        private static final String PROTOCOL_CHARSET = "utf-8"; //默认字符集..
    
        /** Content type for request. */
        private static final String PROTOCOL_CONTENT_TYPE =
            String.format("application/json; charset=%s", PROTOCOL_CHARSET);  //协议内容的类型...
    
        private final Listener<T> mListener; //成功监听...
        private final String mRequestBody;  //请求实体...
    
        //通过url构造请求对象..
        public JsonRequest(String url, String requestBody, Listener<T> listener,
                ErrorListener errorListener) {
            this(Method.DEPRECATED_GET_OR_POST, url, requestBody, listener, errorListener);
        }
        //通过指定方式+url来构造请求对象...
        public JsonRequest(int method, String url, String requestBody, Listener<T> listener,
                ErrorListener errorListener) {
            super(method, url, errorListener);
            mListener = listener;
            mRequestBody = requestBody;
        }
        //请求的分发...
        @Override
        protected void deliverResponse(T response) {
            mListener.onResponse(response);
        }
        //解析请求的抽象方法,使JsonArrayRequest和JsonObjectRequest去实现..
        @Override
        abstract protected Response<T> parseNetworkResponse(NetworkResponse response);
    
        //获取Post请求中实体内容的类型..
        @Override
        public String getPostBodyContentType() {
            return getBodyContentType();
        }
    
        //获取Post请求的实体部分...
        @Override
        public byte[] getPostBody() {
            return getBody();
        }
        //指定内容类型...
        @Override
        public String getBodyContentType() {
            return PROTOCOL_CONTENT_TYPE;
        }
        //获取实体内容的具体过程...
        @Override
        public byte[] getBody() {
            try {
                return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
            } catch (UnsupportedEncodingException uee) {
                VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
                        mRequestBody, PROTOCOL_CHARSET);
                return null;
            }
        }
    }



  • 相关阅读:
    第四章 Zookeeper技术内幕
    容器--TreeMap
    算法--红黑树实现介绍(二)
    算法---红黑树实现介绍(一)
    容器--WeakHashMap
    基础-WeakReference
    容器--IdentityHashMap
    容器--EnumMap
    容器--HashMap
    容器--Map和AbstractMap
  • 原文地址:https://www.cnblogs.com/RGogoing/p/4908737.html
Copyright © 2011-2022 走看看