如何使用改进

时间:2015-09-15 17:27:26

标签: java android json retrofit

所以我有一个改装界面:

public interface RestUserInformation {
    @GET("/api/me")
    void getInfo(Callback<UserInformation> callback);
}

RestAdapter:

RestAdapter userInformation = newRestAdapter.Builder()
                              .setEndpoint(IP_ADDRESS)
                              .setRequestInterceptor(requestInterceptor)
                              .build();

使API调用并接收JSON正文答案如下:

{"user":{ 
     "id":50,
     "email":"mail@mail.com",
     "first_name":"chris",
     "last_name":"cr",
     "birthdate":"1817-03-04",
     "gender":1,
     "country":"fr"
     {     
     "id":8,
     "language":"Spanish",
     "flag_path":"public/images/flags/Argentina.ico",
     "created_at":"2014-11-05T20:42:39.294Z",
     "updated_at":"2014-11-05T20:42:39.294Z",
     "name":"Argentina","available":false,
     "i18n_key":null
     }
    }
}

我想解析它并用它填充一个类,所以我创建了UserInformation.java类:

public class UserInformation {
    int id;
    String email;
    String first_name;
    String last_name;
    String birthdate;
    int gender;
    String country;  }

我一直在尝试使用回调函数执行此操作:

        RestUserInformation getUserInfo = userInformation.create(RestUserInformation.class);
        getUserInfo.getInfo(new Callback<UserInformation>() {
               @Override
               public void success(UserInformation user, Response response) {
                                            }

               @Override
               public void failure(RetrofitError error) {
                                            }
                                        });

我尝试过很多东西,但它不起作用,UserInformation类的属性保持空白。 关于如何做的任何想法?

2 个答案:

答案 0 :(得分:5)

默认情况下,Retrofit使用GSON解析JSON。

GSON尝试使用1:1映射将JSON字段映射到Java对象 - 这就是Java类的结构必须与JSON的结构匹配才能执行自动解析。

这里的问题是您的JSON不是单个对象 - 它是另一个对象中的对象(标记为“user”)。

要解决此问题,您可以创建另一个类来封装外部对象,也可以为GSON创建自定义反序列化器。

外部对象的包装类示例:

public class UserResponse {
    public UserInformation user;
}

以下是自定义反序列化程序的示例,如果您想沿着该路线前进:

public class UserInformationAdapter implements JsonDeserializer<UserInformation> {
    @Override
    public UserInformation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        // Get the root JSON object
        JsonObject rootObject = json.getAsJsonObject();

        // Get the user JSON element
        JsonElement userElement = rootObject.get("user");

        // Let GSON try to automatically deserialize the user element.
        return context.deserialize(userElement, UserInformation.class);
    }
}

您可以在Retrofit中注册此类型的适配器,如下所示:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(UserInformation.class, new UserInformationAdapter());
Gson gson = gsonBuilder.create();
RestAdapter adapter = new RestAdapter.Builder()
    .setConverter(new GsonConverter(gson))
    .build();

这样,GSON不会尝试使用其默认解析策略,而是使用UserInformationAdapter反序列化JSON。

答案 1 :(得分:-2)

你必须使用@SerializedName调整字段来传递相应的json属性,以便Retrofit可以将JSON解析为你的对象 试试这个:

public class UserInformation implements Serializable {
        @SerializedName("id")
        int id;
        @SerializedName("email")
        String email;
        @SerializedName("first_name")
        String first_name;
        @SerializedName("last_name")
        String last_name;
        @SerializedName("birthdate")
        String birthdate;
        @SerializedName("gender")
        int gender;
        @SerializedName("country")
        String country;  
}