【问题标题】:retrofit request body is adding double quotes in @Body parameter改造请求正文在 @Body 参数中添加双引号
【发布时间】:2018-07-20 06:10:24
【问题描述】:

我正在尝试序列化请求,然后再将其发送到改造以进行 Web 服务调用。

当我序列化请求时,我需要将 json 字符串传递给 @Body 参数中的改造调用,因此 生成的 json 字符串会生成以下带有 "(前后双引号)的 json 字符串。

"{\"access_token\":\"d80fa6bd6f78cc704104d61146c599bc94b82ca225349ee68762fc6c70d2dcf0\",\"fitness\":[{\"_id\":\"1d051bfe-df30-4fa0-808b-9d7300a608 :\"877284d3-4f36-4ec0-a536-11563207dc4d\",\"卡路里\":600.0,\"距离\":40.0,\"强度\":\"100\",\"时间戳\":\ "2018-07-18T12:56:43+00:00\",\"type\":\"Running\",\"utc_offset\":\"+05:30\"},{\"_id\ ":\"2004ff72-707d-489a-927e-4cdeed410095\",\"activity_id\":\"5ed7c90f-805e-4763-aa62-7f8126c84f06\",\"卡路里\":600.0,\"距离\": 40.0,\"强度\":\"100\",\"时间戳\":\"2018-07-18T12:56:43+00:00\",\"类型\":\"跑步\", \"utc_offset\":\"+05:30\"}]}"

由于有双引号,第三方 api 无法成功解析。

这是我的请求序列化程序代码

 public class RequestSerializer implements JsonSerializer<Request<?>> {

    @Override
    public JsonElement serialize(Request<?> request, Type typeOfSrc, JsonSerializationContext context) {

        JsonObject jsonObject =  new GsonBuilder().create().toJsonTree(request,Request.class).getAsJsonObject();
        JsonElement requestList = jsonObject.get("requestList");
        jsonObject.remove("requestList");
        jsonObject.add("fitness",requestList);
        return jsonObject;

    }
 }

调用改造网络服务的代码

    GsonBuilder builder = new GsonBuilder();
    builder.excludeFieldsWithoutExposeAnnotation();
    builder.registerTypeAdapter(Request.class, new RequestSerializer());
    Gson gson = builder.create();

    String data = gson.toJson(request);

    Flowable<Response> fitnessFlowable = new WebRequest().getRemoteClient().create(FitnessApi.class).postFitnessData("5b238abb4d3590001d9b94a8",data);

【问题讨论】:

    标签: android json gson retrofit2


    【解决方案1】:

    使用对象消除 POST @Body 中的字符串引用请求, 例如作为我的工作代码:

    class Data{
        @SerializedName("access_token")
        @Expose
        private String access_token;
    
        public String getAccess_token() {
            return access_token;
        }
    
        public void setAccess_token(String access_token) {
            this.access_token = access_token;
        }
    
        // Other field defined here
    }
    
    @Keep
    class Result{
        @SerializedName("rc") int rc;
    }
    
    @Keep
    interface APIFitness{
        @Headers("Content-Type: application/json")
        @POST("api/save/")
        Observable<Result> Save(@Body Data data);
    
        //More methods..
    }
    

    使用

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("url")
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    
        APIFitness service = retrofit.create(APIFitness.class);
        Data data = new Data();
        authCode.setAccess_token(token);
    
        service.Save(data)
               .subscribeOn(Schedulers.io())
               .observeOn(Schedulers.newThread())
               .subscribe( data -> { } )
    

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多