所以,我有一个自定义对象列表,我需要一个像这样的JSON:
{
"surveys": [{
"survey": {
"code": "05052017153632",
"date": "05/05/2017 15:36:32",
"device_id": 1,
"questions_attributes": [{
"kind": "string",
"label": "Você encontrou tudo o que procurava?",
"value": "Infelizmente, não"
}, {
"kind": "string",
"label": "Em qual departamento você não encontrou o produto?",
"value": "FERRAMENTAS, TAPETES"
}, {
"kind": "string",
"label": "Deseja que a Havan entre em contato com você?",
"value": "Não informado"
}, {
"kind": "string",
"label": "Nome",
"value": "Não informado"
}, {
"kind": "string",
"label": "E-mail",
"value": "Não informado"
}, {
"kind": "string",
"label": "Telefone",
"value": "Não informado"
}]
}
}]}
但我没有任何想法如何使用Gson做到这一点。 我正在使用Retrofit 2并且需要将此JSON传递给正文请求。 任何想法?
答案 0 :(得分:8)
是的,您需要将此JSON传递给正文请求。
public interface RetrofitInterface<R extends RetrofitClass> {
@Headers({"Content-Type: application/json", "Cache-Control: max-age=640000"})
@POST("v1/auth/")
public Call<ResponseBody> callLogin(@Query("key") String key, @Body LoginModel body);
@Headers({"Content-Type: application/json", "Cache-Control: max-age=640000"})
public static final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(AppConstants.mBaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
将json对象传递给body请求使用@Body param。
在这里你可以在http://www.jsonschema2pojo.org/中创建gson模型类 使用json请求格式的json到gson转换器。
之后用gson pojo类设置值,并在改进时将json对象传递给body请求。
public class LoginModel {
@SerializedName("username")
private String username;
@SerializedName("password")
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
LoginModel model_obj = new LoginModel();
mModel_obj.setUsername(mUsername);
mModel_obj.setPassword(mPassword);
Call<ResponseBody> call = service.callLogin(AppConstants.mApiKey, model_obj);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
答案 1 :(得分:5)
我在1年前看到了这个问题,现在我正在使用另一个解决方案。如果有人仍然需要帮助并且正在寻找这个,我们就去:
我已经创建了一个函数来处理我想要的JSON格式:
public String serialize(List<Object> objects, String arrKey, String
objKey) {
JsonArray ja = new JsonArray();
for (Object object: objects) {
Gson gson = new Gson();
JsonElement je = gson.toJsonTree(object);
JsonObject jo = new JsonObject();
jo.add(objKey, je);
ja.add(jo);
}
JsonObject objMain = new JsonObject();
objMain.add(arrKey,ja);
return objMain.toString();
}
在我的API调用中,我有这一行:
String json = new CustomGsonAdapter().serialize(surveysList, "surveys","survey");
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
RequestBody
就是诀窍。现在,只需要将此RequestBody
传递给改装调用即可。
@POST("surveys")
Call<Void> setSurveys(@Body RequestBody json);
我不知道这是否是解决问题的最好办法,但对我来说却是。 节省时间,避免创建只发送到服务器的类。
答案 2 :(得分:2)
@POST("users/new")
Call<User> createUser(@Body User user);
上面的代码将用Api服务接口编写。 然后你可以通过将JsonObject作为Body传递来从RestClient类(通过Retrofit实例)调用它。