所以我有一个改装界面:
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类的属性保持空白。 关于如何做的任何想法?
答案 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;
}