2014-06-25 14 views
7

Sto inviando una JSONArray GET richiesta con Volley, e sta restituendo l'array JSON specificato. Ecco la mia richiesta:Parse Android Volley JSONArray risposta

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 
} 

Come potete vedere, sto attualmente effettuando il logout della risposta. Voglio analizzare l'array e visualizzare i risultati in una visualizzazione elenco. La documentazione per questo non è eccezionale, e sono abbastanza verde in termini di Android Dev. Qual è il modo corretto di analizzare un array JSON da Volley e visualizzare i risultati in una visualizzazione elenco? I've gathered che dovrei usare parseNetworkResponse, ma non sono sicuro di come implementarlo.

risposta

38

mi consiglia di attenersi alla biblioteca GSON per JSON parsing. Ecco come una richiesta di Volley con l'elaborazione di JSON incorporato potrebbe apparire poi:

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)); 
     } 
    } 
} 

Immaginiamo di avere un metodo server situato presso http://example.com/api/persons/ che restituisce una matrice JSON di persona; Persona è la seguente:

public class Person { 
    String firstName; 
    String lastName; 
} 

Possiamo chiamare il metodo di cui sopra in questo modo:

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); 

E infine, nel ascoltatore risposta che abbiamo ottenere un array di persona che può essere convertito in un elenco e alimentato l'adattatore di ListView .

+1

Da dove viene l'ultimo frammento di codice andare? E dove è definito VolleyQueue? – Greg

+0

possiamo usare il metodo token di tipo qui? –

+0

Nice sample.its ha aiutato.! –

0

È possibile utilizzare il nativo JSONParsor in i framework Android vostre esigenze sono relativamente meno e la JSON è semplice. Here è un collegamento per il tutorial.

Ma se si utilizza complessiJSON oggetti, utilizzare le librerie come

  • GSON
  • Jackson

trovo GSON più semplice ed efficace da usare . Lei sa più su di esso da Here

+0

Grazie, mi sarà probabilmente usare GSON. Puoi approfondire come effettivamente analizzare un array? L'esempio a cui si fa riferimento utilizza AsyncTask, non Volley quindi è un po 'di confusione. Ho trovato che ci sono molte risorse per analizzare un oggetto JSONObject, ma non così tante per un array che è quello con cui ho a che fare. – settheline

+0

passare la stringa di risposta da 'volley' a' gson' – SathMK