2014-06-25 13 views
7

Wysyłam żądanie JSONArray GET z Volley i zwraca określonej tablicy JSON. Oto moja prośba:Parsowanie Android Volley JSONArray odpowiedź

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 
} 

Jak widać, obecnie wylogowuję się z odpowiedzi. Chcę przeanalizować Array i wyświetlić wyniki w widoku listy. Dokumentacja nie jest świetna, a ja jestem całkiem zielony pod względem systemu Android. Jaki jest właściwy sposób analizowania tablicy JSON z Volley i wyświetlania wyników w widoku listy? I've gathered, który powinienem użyć parseNetworkResponse, ale nie wiem, jak zaimplementować.

Odpowiedz

38

Zalecam trzymać się biblioteki GSON do parsowania JSON. Oto jak prośba Volley z wbudowanego przetwarzania JSON mógłby wyglądać wtedy:

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

Wyobraźmy sobie, że masz sposób serwer znajdujący się http://example.com/api/persons/ która zwraca tablicę JSON osoby; Osoba jest następująca:

public class Person { 
    String firstName; 
    String lastName; 
} 

Możemy zadzwonić powyższa metoda tak:

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

I wreszcie w słuchacza odpowiedzi otrzymujemy szereg osób, które mogą być zamienione na listy i doprowadza do adaptera ListView za .

+1

Gdzie kończy się ostatni fragment kodu? I gdzie jest zdefiniowany VolleyQueue? – Greg

+0

Czy możemy użyć tutaj metody tokena typu? –

+0

Dobre sample.its pomógł.! –

0

Można użyć natywnej JSONParsor w Android framework twoje wymagania są stosunkowo mniej i JSON jest proste. Here to link do samouczka.

Ale jeśli używasz złożonychJSON obiektów, korzystać z bibliotek jak

  • GSON
  • Jackson

znajdę GSON łatwiejsze i bardziej efektywne w użyciu . Wiesz więcej na ten temat od Here

+0

Dziękuję, prawdopodobnie wykorzystam GSON. Czy potrafisz jednak wyjaśnić, jak właściwie analizować Array? Przykład, do którego się odwołujesz, używa AsyncTask, a nie Volley, więc jest nieco mylący. Odkryłem, że istnieje wiele zasobów na analizowanie JSONObject, ale nie tyle dla Array, z czym mam do czynienia. – settheline

+0

przekazać ciąg odpowiedzi z 'volley' na' gson' – SathMK

Powiązane problemy