2014-06-25 139 views
7

我发送一个JSONArray GET请求与Volley,它返回指定的JSON数组。这里是我的请求:解析Android Volley JSONArray回复

JsonArrayRequest getRequest = new JsonArrayRequest(url, 
        new Response.Listener<JSONArray>() 
        { 
         @Override public void onResponse(JSONArray response) { 

          Log.d("Response", response.toString()); 
         } 
        }, 
        new Response.ErrorListener() 
        { 
         @Override public void onErrorResponse(VolleyError error) { 
          Log.d("Error.Response", error.toString()); 
         } 
        } 
       ); 
        VolleySingleton.getInstance(this).addToRequestQueue(getRequest); //Call to get dashboard feed 
} 

正如你所看到的,我目前只是注销响应。我想解析数组,然后在列表视图中显示结果。这方面的文档并不好,我在Android开发方面非常绿色。解析来自Volley的JSON数组并将结果显示在列表视图中的正确方法是什么? I've gathered,我应该使用parseNetworkResponse,但不知道如何实现。

回答

38

我建议坚持GSON库JSON解析。这里的嵌入式JSON处理凌空请求怎么会看那么:

import java.io.UnsupportedEncodingException; 

import com.android.volley.NetworkResponse; 
import com.android.volley.ParseError; 
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.toolbox.HttpHeaderParser; 
import com.google.gson.Gson; 
import com.google.gson.JsonSyntaxException; 

/** 
* Volley GET request which parses JSON server response into Java object. 
*/ 
public class GsonRequest<T> extends Request<T> { 

    /** JSON parsing engine */ 
    protected final Gson gson; 

    /** class of type of response */ 
    protected final Class<T> clazz; 

    /** result listener */ 
    private final Listener<T> listener; 

    public GsonRequest(String url, Class<T> clazz, Listener<T> listener, 
      ErrorListener errorListener) { 
     super(Method.GET, url, errorListener); 

     this.clazz = clazz; 
     this.listener = listener; 
     this.gson = new Gson(); 
    } 

    @Override 
    protected void deliverResponse(T response) { 
     listener.onResponse(response); 
    } 

    @Override 
    protected Response<T> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String json = new String(
        response.data, HttpHeaderParser.parseCharset(response.headers)); 
      return Response.success(
        gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)); 

     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JsonSyntaxException e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 
} 

让我们想象一下,你有位于http://example.com/api/persons/服务器方法,它返回一个Person的JSON阵列;人如下:

public class Person { 
    String firstName; 
    String lastName; 
} 

我们可以把上述方法是这样的:

GsonRequest<Person[]> getPersons = 
     new GsonRequest<Person[]>("http://example.com/api/persons/", Person[].class, 

      new Listener<Person[]>() { 
       @Override 
       public void onResponse(Person[] response) { 
        List<Person> persons = Arrays.asList(response); 
        // TODO deal with persons 
       } 

      }, new ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        // TODO deal with error 
       } 
      }); 

VolleyQueue.get().add(getPersons); 

最后响应监听器,我们得到人的阵列可转换列出并送入ListView的适配器。

+1

最后一段代码片段在哪里? VolleyQueue在哪里定义? – Greg

+0

我们可以在这里使用类型标记方法吗? –

+0

不错的sample.its帮助。 –

0

您可以使用在本地JSONParsor的样品链接Android框架的要求相对较少,JSON简单Here是本教程的链接。

但是,如果你正在使用复杂JSON对象,请使用库,例如​​

  • GSON
  • 杰克逊

我发现GSON更容易,更有效的使用。你知道更多关于它从Here

+0

谢谢,我可能会使用GSON。你能详细说明如何实际解析数组吗?你引用的例子使用AsyncTask,而不是Volley,所以它有点混乱。我发现在解析JSONObject时有很多资源,但对于我正在处理的Array而言,并不是那么多。 – settheline

+0

将响应字符串从'volley'传递到'gson' – SathMK