我是新手进行改造,我想知道是否有更好的方法可以在发出/发布请求时获得此结果:
"user": {
"owner_id": 1,
"first_name": "test",
"middle_name": "test2",
"last_name": "test3"
...
}
现在为了获得这个,我有这个模型:
public class User implements Serializable {
@SerializedName("id")
@Expose
private int id;
@SerializedName("owner_id")
@Expose private int ownerId;
@SerializedName("first_name")
@Expose private String firstName;
@SerializedName("middle_name")
@Expose private String middleName;
@SerializedName("last_name")
@Expose private String lastName;
@SerializedName("username")
@Expose private String username;
@SerializedName("email")
@Expose private String email;
@SerializedName("password")
@Expose private String password;
@SerializedName("api_token")
@Expose private String apiToken;
@SerializedName("settings")
@Expose private UserSettings settings;
@SerializedName("active")
@Expose private int active;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getOwnerId() {
return ownerId;
}
public void setOwnerId(int ownerId) {
this.ownerId = ownerId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getApiToken() {
return apiToken;
}
public void setApiToken(String apiToken) {
this.apiToken = apiToken;
}
public UserSettings getSettings() {
return settings;
}
public void setSettings(UserSettings settings) {
this.settings = settings;
}
public int getActive() {
return active;
}
public void setActive(int active) {
this.active = active;
}
}
我将它包装在另一个中:
public class UserRequest implements Serializable {
@SerializedName("user")
@Expose private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
我的请求格式:
@PUT(BuildConfig.BASE_API_VERSION + "main/users/user-details")
Call<ResponseBody> putUserDetails(@Body UserRequest userDetailsRequest);
我不认为这是完成工作的最佳方法,对于一个对象请求有2个类似乎有点乏味。 谢谢大家的时间!
答案 0 :(得分:0)
您可以使用自定义JsonSerializer
来实现这一目标:
gsonBuilder.registerTypeAdapter(User.class, new UserSerializer());
Gson customGson = gsonBuilder.create(); // use this instance for your Retrofit service.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(...)
.addConverterFactory(GsonConverterFactory.create(customGson))
.build();
class UserSerializer implements JsonSerializer<User> {
@Override
public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject userJson = new JsonObject();
userJson("user", context.serialize(src));
return userJson;
}
};
虽然需要更多配置。
答案 1 :(得分:0)
我最终创建了一张我在@Body中发送的地图,如下所示:
//Create a map for the query params
Map<String, User> queryParams = new HashMap<>();
queryParams.put("user_details", userDetails);
final Call<BaseResponseModel<User>> res = apiService.putUserDetails(queryParams);
res.enqueue(new Callback<BaseResponseModel<User>>() {
@Override
public void onResponse(Call<BaseResponseModel<User>> call, retrofit2.Response<BaseResponseModel<User>> response) {
if (response.isSuccessful() && response.body().isSuccess()){
//manipulate the response data
back.onResponse(call, response);
}
else {
back.onFailure(call, null);
}
}
@Override
public void onFailure(Call<BaseResponseModel<User>> call, Throwable t) {
back.onFailure(null, t);
}
});
我的请求格式:
@PUT(BuildConfig.BASE_API_VERSION + "main/users/user-details")
Call<BaseResponseModel<User>> putUserDetails(@Body Map<String, User> params);
模型保持不变,请求如下所示:
"user": {
"owner_id": 1,
"first_name": "test",
"middle_name": "test2",
"last_name": "test3"
...
}