代码之家  ›  专栏  ›  技术社区  ›  ardiien

改装请求主体前面的2个不同支架的奇怪组合

  •  1
  • ardiien  · 技术社区  · 7 年前

    我正在使用 改造2 我被困在这个问题上了。我为body编写了简单的实体:

    data class DateRequest(
    @JsonAdapter(RetrofitDateSerializer::class)
    @SerializedName("date") @Expose val date: OffsetDateTime)
    

    我还为它编写了自定义序列化程序:

    class RetrofitDateSerializer : JsonSerializer<OffsetDateTime> {
    override fun serialize(
        srcDate: OffsetDateTime?,
        typeOfSrc: Type?,
        context: JsonSerializationContext?
    ): JsonElement? {
        val formatted = DateTimeUtil.convertFromDateTime(srcDate!!)
        return JsonPrimitive(formatted)
    }}
    

    DateTimeUtil :

    fun convertFromDateTime(dateTime: OffsetDateTime): String {
        val formatter = formatDateTime()
        return formatter.format(dateTime)
    }
    fun formatDateTime(): DateTimeFormatter {
        return DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss").withLocale(Locale.US)
    }
    

    )]}'{"date": "2018-12-07 06:00:00"}
    

    “这是怎么回事?” )]}' “可以挂在我的手机前面” 日期 “请求中的json?

    @POST("changecleaning/{userId}/{cleaningId}/{status}")
    fun changeCleaning(
        @Path("userId") userId: Long,
        @Path("cleaningId") cleaningId: Long,
        @Path("status") status: Int,
        @Body date: DateRequest
    ): Maybe<Status>
    

    只有我找到的才是我想要的 JsonWriter 做一些魔术 buffer.readByteString() 它储存破碎的尸体。

    GSONB转换器 :

    @Override public RequestBody convert(T value) throws IOException {
        Buffer buffer = new Buffer();
        Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
        JsonWriter jsonWriter = gson.newJsonWriter(writer);
        adapter.write(jsonWriter, value);
        jsonWriter.close();
        return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
    

    }

    1 回复  |  直到 7 年前
        1
  •  0
  •   ardiien    7 年前

    我发现问题出在哪里:

    GsonBuilder :

    private fun getGsonFactory(): Gson {
            return GsonBuilder()
                .setLenient()
                .serializeSpecialFloatingPointValues()
                .setLongSerializationPolicy(LongSerializationPolicy.DEFAULT)
                .generateNonExecutableJson()
                .enableComplexMapKeySerialization()
                .serializeNulls()
                .setPrettyPrinting()
                .registerTypeAdapter(CleaningProgress::class.java, CleaningProgressDeserializer())
                .create()
        }
    

    在下面的代码行中,添加“ )]}' “在请求之前。我为什么要将其添加到生成器?我相信有关此方法的官方文档:

    .generateNonExecutableJson()
    

    GsonBuilder 看起来像这样:

    private fun getGsonFactory(): Gson {
        return GsonBuilder()
            .serializeNulls()
            .registerTypeAdapter(CleaningProgress::class.java, CleaningProgressDeserializer())
            .create()
    }