android - 改造请求正文在@Body 参数中添加双引号

标签 android json gson retrofit2

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

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

"{\"access_token\":\"d80fa6bd6f78cc704104d61146c599bc94b82ca225349ee68762fc6c70d2dcf0\",\"fitness\":[{\"_id\":\"1d051bfe-df30-4fa0-808b-9d7300a608ab\",\"activity_id\":\"877284d3-4f36-4ec0-a536-11563207dc4d\",\"calories\":600.0,\"distance\":40.0,\"intensity\":\"100\",\"timestamp\":\"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\",\"calories\":600.0,\"distance\":40.0,\"intensity\":\"100\",\"timestamp\":\"2018-07-18T12:56:43+00:00\",\"type\":\"Running\",\"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;

    }
 }

调用retrofit webservice的代码

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

最佳答案

使用对象消除了 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 -> { } )

关于android - 改造请求正文在@Body 参数中添加双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51436064/

相关文章:

jquery - 如何使用GSON并在JSP文件中显示信息

android - 在 Android google maps api v2 for 4.0 中,显示从当前位置到给定经纬度的路线

json - 如何搜索从 url 获取并使用 httparty 解析的 json 数组?

android - Robolectric:Android 中的 SAXParser 与 Java 中的 SAXParser (robolectric):localname 与 qname 的差异

javascript - 经过验证的JSON抛出SyntaxError : Property must be a string literal

java - 从 JSON 中确定对象类型并使用 GSON 创建对象

java - 由于错误,无法将 json 字符串转换为 POJO 需要一个字符串,但结果是 BEGIN_ARRAY

java - 需要 GSON 返回一个 Java JSONArray

java - 从监听器触发 AsyncTask - AndroidStudio 1.2.2 - java.lang.NoClassDefFound

android - 以编程方式更改 Gingerbread 中的 Actionbar 标题颜色