【问题标题】:retrofit 2 - how to pass a POST json object改造 2 - 如何传递 POST json 对象
【发布时间】:2021-08-20 16:49:25
【问题描述】:

所以,我有一个我的自定义对象列表,我需要一个这样的 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 传递到正文请求中。 有什么想法吗?

【问题讨论】:

标签: android gson


【解决方案1】:

是的,您需要将此 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();
}

API 调用活动:

使用 @Body 参数将 json 对象传递到正文请求中。

这里可以在http://www.jsonschema2pojo.org/创建gson模型类 使用该 json 请求格式将 json 转换为 gson。

之后,使用该 gson pojo 类设置值并将 json 对象传递给改造中的正文请求。

例如:

登录模型:

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;
}
}

用 pojo 类设置值:

LoginModel model_obj = new LoginModel();
    mModel_obj.setUsername(mUsername);
    mModel_obj.setPassword(mPassword);

API 调用:

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) {
    }
});

【讨论】:

    【解决方案2】:

    我看到了我 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);
    

    我不知道这是否是解决问题的最佳方式,但对我来说确实如此。 节省时间,避免创建一个类只是为了发送到服务器。

    【讨论】:

      【解决方案3】:
      @POST("users/new")
      Call<User> createUser(@Body User user);
      

      以上代码将使用 Api 服务接口编写。 然后你可以通过将 JsonObject 作为 Body 从 RestClient 类(通过 Retrofit 实例)调用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多