2016-06-14 8 views
0

Я читаю часть другого сообщения внутри stackoverflow, но я не могу заставить его работать.Как использовать Retrofit2 + GSON -> Класс с пользовательским объектом?

У меня есть данные, возвращаемые сервером, который имеет следующий вид:

SERVER RESPONSE

{ 
    "userData": { 
    "username": "victor.javier", 
    "email": "[email protected]", 
    "createdAt": "2016-05-11T09:55:14.720Z", 
    "updatedAt": "2016-05-11T09:55:14.720Z", 
    "id": "5733018274ddfad25" 
    }, 
    "token": "SkpaNuXdzfrhiH06qGK93EH2ujM37hfk02F8o2EodYJumG" 
} 

Мой код POJOs являются следующие:

User.class

public class User { 

    @SerializedName("userData") 
    @Expose 
    private UserData userData; 

    @SerializedName("token") 
    @Expose 
    private String token; 

    ... CONSTRUCTOR AND GETTERS/SETTERS 

} 

UserData.class

public class UserData { 

    @SerializedName("username") 
    @Expose 
    private String username; 

    @SerializedName("email") 
    @Expose 
    private String email; 

    @SerializedName("createdAt") 
    @Expose 
    private String createdAt; 

    @SerializedName("updatedAt") 
    @Expose 
    private String updatedAt; 

    @SerializedName("id") 
    @Expose 
    private String id; 

    ... CONSTRUCTOR AND GETTERS/SETTERS 

} 

я скопировал с другого поста в следующий класс десериализации GSON. Код:

RestDeserializer.class

public class RestDeserializer<T> implements JsonDeserializer<T> { 

    private Class<T> mClass; 
    private String mKey; 

    public RestDeserializer(Class<T> targetClass, String key) { 
     mClass = targetClass; 
     mKey = key; 
    } 

    @Override 
    public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) 
      throws JsonParseException { 
     JsonElement content = je.getAsJsonObject().get(mKey); 
     return new Gson().fromJson(content, mClass); 

    } 
} 

Реализация дооснащения является:

RetroFitImpl

public class UserApiImpl implements UserApi { 

    @Inject 
    public UserApiImpl() { } 

    @Override 
    public User loginUser(String identifier, String password) { 
     Retrofit retrofitBuilder = getRetrofitBuilder(); 
     UserRetrofitApi userRetrofitApi = retrofitBuilder.create(UserRetrofitApi.class); 

     LoginRequestEntity loginRequestEntity = new LoginRequestEntity(); 
     loginRequestEntity.setIdentifier(identifier); 
     loginRequestEntity.setPassword(password); 

     Call<User> call = userRetrofitApi.loginUser(loginRequestEntity); 
     Response<User> response = null; 
     try { 
      response = call.execute(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     User body = null; 
     if (response != null) { 
      body = response.body(); 
     } 
     return body; 
    } 

    private Retrofit getRetrofitBuilder() { 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 

     return new Retrofit.Builder() 
       .baseUrl(BuildConfig.API_URL) 
       .client(client) 
       .addConverterFactory(buildGsonConverter()) 
       .build(); 
    } 

    private static GsonConverterFactory buildGsonConverter() { 
     GsonBuilder gsonBuilder = new GsonBuilder(); 

     Gson gson = new GsonBuilder() 
       .registerTypeAdapter(User.class, new RestDeserializer<>(User.class, "userData")) 
       .create(); 

     return GsonConverterFactory.create(gson); 
    } 
} 

я делаю что-то неправильно с buildGsonConverter метод bec ause Мне звонят в onrrror of retrofit каждый раз, поэтому я думаю, что это проблема в строительстве GSON.

Любой может сказать мне, как разбирать это, чтобы построить GSON, как ответ сервера?

спасибо.

ответ

0

Проверьте пример из модифицированной документации

http://square.github.io/retrofit/

Вам не нужно создавать собственный gson завод

.addConverterFactory(GsonConverterFactory.create()) 

А также добавить в build.gradle

com.squareup.retrofit2:converter-gson 
+0

Я удалил линию, но это не решение. Спасибо. Paul – MAOL

+0

Вам не нужно удалять свою линию, вам нужно использовать фабрику gson convertor, как в примере! –

0

Вам не нужно создавать pojo самостоятельно. Вы можете использовать http://jsonschema2pojo.com, чтобы создать ответ серверного сервера pojo.

+0

Мои позы, кажется, ОК, Prasheel. – MAOL

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