2015-05-06 2 views
0

Удачный Войти возвращает следующую JSONObject с сервера:дооснащения не разборе JSONObject

{"success":true,"message":"Sign in success.","response_data":{"user_id":"24", "email_id":"[email protected]", "secret_code": "You did it!"}} 

Я хочу поставить информацию response_data в мой User объект. Я использовал, чтобы сделать что-то вроде этого:

String getResponse = jsonObject.getString("response_data"); 

Gson gson = new GsonBuilder() 
     .disableHtmlEscaping() 
     .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE) 
     .setPrettyPrinting() 
     .serializeNulls() 
     .create(); 

//All the data in the `response_data` is initialized in `User` 
User user = gson.fromJson(getResponse, User.class); 

Теперь я попытался сделать то же самое ретрофитом:

Initializing RestAdapter + Интерфейс:

public class ApiClient { 
    private static RetrofitService sRetrofitService; 

    public static RetrofitService getRetrofitApiClient() { 
     if (sRetrofitService == null) { 
      RestAdapter restAdapter = new RestAdapter.Builder() 
        .setLogLevel(RestAdapter.LogLevel.FULL) 
        .setEndpoint("http://xxx.xxx.xxx.xxx/") 
        .build(); 

      sRetrofitService = restAdapter.create(RetrofitService.class); 
     } 

     return sRetrofitService; 
    } 

    public interface RetrofitService { 

     @FormUrlEncoded 
     @POST("/login") 
     public void login(@Field("email_id") String emailId, @Field ("password") String password, 
          Callback <User> callback);                  
    } 
} 

MainActivity:

ApiClient.getRetrofitApiClient().login(email.getText().toString(), password.getText().toString(),  
     new Callback<User>() { 
      @Override 
      public void success(User user, Response response) { 
       User user1 = user; //null 
       Toast.makeText(this, "user is: "+user1.toString(), Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast.makeText(this, "Failed Login", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

пользователя :

public class User { 

    private String userId; 
    private String emailId; 
    private String code; 

    public User() { 

    } 

    ... getters 
    ... setters 
} 

Retrofit код в MainActivity работ, и я получаю этот ответ в моем log:

{"success":true,"message":"Sign in success.","response_data":{"user_id":"24", "email_id":"[email protected]", "secret_code": "You did it!"}} 

Однако это не разбирать response_data в мой User объект.

Как исправить это?

+0

нет, просто опечатка, к сожалению ... я исправлю это. Спасибо, что указали, что вышли – user2456977

ответ

5

Вам нужно создать объект ответа

public class UserResponse { 
    private User responseData; 
    private String message; 
    private boolean success; 
} 

И изменить свой обратный вызов, чтобы вернуть UserResponse

public interface RetrofitService { 
    @FormUrlEncoded 
    @POST("/login") 
    public void login(@Field("email_id") String emailId, @Field ("password") String password, 
         Callback <UserResponse> callback);                  
} 

ПРИМЕЧАНИЕ: Вы также должны создать свой собственный Gson экземпляр и aplly что к остальному адаптеру.

RestAdapter restAdapter = RestAdapter.Builder() 
    .setEndpoint("xxx") 
    .setConverter(new GsonConverter(gson)) 
    .build() 
+0

Я использовал только Gson до The Retrofit. Не интегрирован ли Gson в «Дооснащение»? Зачем мне нужно объявлять пользовательский экземпляр Gson? – user2456977

+0

спасибо, что он работает! – user2456977

+0

@ user2456977 Вы добавляете конвертер, чтобы вы могли настраивать такие параметры, как политика именования полей. Вам не нужно, если вы используете все значения по умолчанию. – cyroxis

1

Во-первых,

setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE); 

Вы хотите

setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 

как это, как ваши поля названы. (например, response_data)

Тогда ваш класс User не отвечает на ваши вопросы. Создайте класс модели, который имитирует структуру вашего json-объекта. (как было предложено cyroxis).

И, наконец, имена ваших членов java несовместимы с именованием ваших json-полей (например, secret_code против code в User). Либо исправьте это, либо используйте @SerializedName, чтобы явно сопоставить поле json с полем java.

+0

Я только использовал Gson перед обновлением. Не интегрирован ли Gson в «Дооснащение»? Зачем мне нужно объявлять пользовательский экземпляр Gson? И спасибо за указание несоответствий. Я исправлю их – user2456977

+0

, вам нужно настроить свой экземпляр gson, если ваши json-поля не соответствуют вашим java-полям. Обычно, когда json использует случай змеи, а java использует случай верблюда. – njzk2

+0

также, модификация не делает никакой интерпретации для вас. Вы говорите, что помещаете эти данные в экземпляр пользователя, он пытается это сделать. И ваши данные не являются Пользователем. Он представляет объект, который содержит поле 'response_data', которое является данными для Пользователя. – njzk2

1

Если вы делаете две вещи, это может решить вашу проблему:

  1. Изменить ваш FieldNamingPolicy на вашем GSON Builder использовать LOWER_CASE_WITH_UNDERSCORES
  2. изменить сферу ваших переменных в UserResponse и Пользователем общественности (это не может не требуется)
+0

Я только использовал Gson до модернизации. Не интегрирован ли Gson в «Дооснащение»? Зачем мне нужно объявлять пользовательский экземпляр Gson? – user2456977

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