使用Gson反序列化给出“没有参数就无法调用公共okhttp3.RequestBody()”

时间:2019-03-06 16:38:16

标签: java android gson deserialization okhttp3

我正在尝试在没有Internet连接的情况下缓存一些网络呼叫,以便以后可以重试,

我通过使用Gson.toJson(...)序列化okhttp3.Request对象来做到这一点 (以及一些其他信息,例如时间戳等)。并且序列化工作正常,并且a已经检查了生成的JSON,并且所有数据都按预期存在。

但是,当我以后想用Gson.FromJson(...)反序列化json时,会抛出错误:

  

java.lang.RuntimeException:无法调用公共   okhttp3.RequestBody()没有参数


,我还无法弄清楚该错误的解决方法。

任何帮助将不胜感激。

[编辑] 我的身体构造如下:

FormBody.Builder body = new FormBody.Builder();
body.add({name}, {value});
body.add({name}, {value});
body.build();

1 个答案:

答案 0 :(得分:0)

所以我发现反序列化okhttp3.Request对象只是行不通。

相反,我制作了一个简单的结构“ PostBodyHolder”作为请求对象,然后将其缓存,当我实际执行请求时,我从PostBodyHolder构建了okhttp3.Request对象。

public class PostBodyHolder {

    /**
     * The params of this body.
     */
    public final List<Param> params = new ArrayList<>();
    /**
     * The URL for this body.
     */
    public String url;

    public PostBodyHolder(String url) {
        this.url = url;
    }

    public PostBodyHolder add(@NonNull String name, @NonNull String value) {
        params.add(new Param(name, value));
        return this;
    }

    /**
     * Holder for body params.
     */
    public class Param {

        /**
         * The name of the Param
         */
        public String name;
        /**
         * The Value of the Param
         */
        public String value;

        public Param(@NonNull String name, @NonNull String value) {
            this.name = name;
            this.value = value;
        }
    }
}

对这里感兴趣的是Kotlin版本

class PostBodyHolder(
        /**
         * The URL for this body.
         */
        var url: String) {

    /**
     * The params of this body.
     */
    val params: MutableList<Param> = ArrayList()

    fun add(name: String, value: String): PostBodyHolder {
        params.add(Param(name, value))
        return this
    }

    /**
     * Holder for body params.
     */
    inner class Param(
            /**
             * The name of the Param
             */
            var name: String,
            /**
             * The Value of the Param
             */
            var value: String)
}