2015-08-11 2 views
1

Я пытаюсь выяснить, как извлечь данные из моего ответа JSON и просмотреть данные. У меня есть следующий Дооснащаемый код для запроса данных в формате JSON с моей REST API:Извлечение данных JSON с помощью дооснащения и Gson

final RestAdapter restAdapter = new RestAdapter.Builder() 
      .setEndpoint(URL) 
      .build(); 

    final ApiEndpointInterface apiService = restAdapter.create(ApiEndpointInterface.class); 

    apiService.getJsonData(1, new Callback<User>() { 

     @Override 
     public void success(User user, Response response) { 
      Gson gson = new GsonBuilder().registerTypeAdapter(User.class, new Deserializer()).create(); 
      User c = gson.fromJson(response.getBody().toString(), User.class); 
     } 

     @Override 
     public void failure(RetrofitError retrofitError) { 
      retrofitError.printStackTrace(); 
     } 
    }); 

И мой десериализатор:

class Deserializer implements JsonDeserializer<User> { 
    @Override 
    public User deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) 
      throws JsonParseException { 
     // Get the "content" element from the parsed JSON 
     JsonElement content = je.getAsJsonObject().get("data"); 

     // Deserialize it. You use a new instance of Gson to avoid infinite recursion 
     // to this deserializer 
     return new Gson().fromJson(content, User.class); 

    } 
} 

JSON ответ:

{ 
    "success":true, 
    "data":[ 
     { 
      "id":"1", 
      "username":"User1" 
     }, 
     { 
      "id":"2", 
      "username":"User2" 
     } 
    ] 
} 

В success обратного вызова ДООСНАСТКЕ, в Я не уверен, как на самом деле перебирать элементы данных и извлекать из него данные (например, имя пользователя).

+1

а/данных не является объектом JSON. b/вам не нужно вызывать gson самостоятельно, так как вы можете видеть, что ваш обратный вызов уже дает вам объект User. (но для этого вам нужно будет предоставить объект gson для модифицированного конструктора) – njzk2

ответ

2

Создать эта модель классов:

private class ResponseData { 
    public boolean success; 
    public List<User> data; 
} 

private class User { 
    public String id; 
    public String username; 
} 

Теперь вы можете сделать это:

final RestAdapter restAdapter = new RestAdapter.Builder() 
     .setEndpoint(URL) 
     .build(); 

final ApiEndpointInterface apiService = restAdapter.create(ApiEndpointInterface.class); 

apiService.getJsonData(1, new Callback<ResponseData>() { 

    @Override 
    public void success(ResponseData responseData, Response response) { 
     for (User u : responseData.data) { 
      String name = u.username; 
      // etc 
     } 
    } 

    @Override 
    public void failure(RetrofitError retrofitError) { 
     retrofitError.printStackTrace(); 
    } 
}); 
+0

Ошибка 'data не является общедоступной в com.project.app.API.ResponseData. Нельзя получить доступ из внешнего пакета. Я попытался сделать его 'public List data;', но я получаю ошибку 'неправильный тип 2-го аргумента. Найдено retrofit.Callback , требуется: retrofit.Callback '. – user5213685

+0

Я исправил фрагмент. Не могли бы вы проверить это еще раз? –

+0

@ user5213685 проверить мое обновление –

Смежные вопросы