【问题标题】:Proper decoding of server response [duplicate]正确解码服务器响应[重复]
【发布时间】:2020-10-20 17:25:56
【问题描述】:

在我的应用程序中,我使用 Retrofit+Gson 与服务器通信。但是,服务器响应存在编码问题。
在 OkHttp 日志拦截器中,服务器响应如下所示,可以:

... "name":"S\u0026#39;mores" ...

这是服务器响应 JSON 的一部分。当响应被 Gson 反序列化后,反序列化后的字符串如下所示:

S'mores

我想知道反序列化过程中发生了什么以及如何正确编码字符串。
下面是我的改造初始化代码:

val client = OkHttpClient.Builder()
            .addInterceptor(
                HttpLoggingInterceptor()
                    .setLevel(HttpLoggingInterceptor.Level.BODY)
            )

mRetrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client.build())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        mAPI = mRetrofit.create(PetfinderJSONAPI::class.java)

我尝试了什么:

  • 设置gson.disableHtmlEscaping()并将其传递给GsonConverterFactory.create()
  • 添加设置Accept-Charset: utf-8的OkHttp拦截器
  • 通过URLDecoder.decode()Html.fromHtml() 在将字符串设置为文本字段之前手动解码字符串

这些都没有帮助。我的字符串仍未正确编码。

编辑:根据this html 解码器站点,' 被解码为'。因此,我希望我的解码字符串是S'mores

【问题讨论】:

    标签: android json gson retrofit okhttp


    【解决方案1】:

    unicode \u0026 指的是十六进制值 26,或十进制的 38。 ASCII 38 表示与号 (&)。 https://www.ascii-code.com/

    【讨论】:

    • 是的,谢谢。现在我看到服务器发送 HTML 编码数据,然后以 utf-8 编码。那么,如何使用 Gson+Retrofit 来解码呢?
    【解决方案2】:

    好吧,我找到了类似旧问题的答案: https://stackoverflow.com/a/52524583/10267053

    就像那里一样,我创建了自定义反序列化器:

    class HtmlDeserializer: JsonDeserializer<String> {
        @Throws(JsonParseException::class)
        override fun deserialize(
            json: JsonElement, typeOfT: Type?,
            context: JsonDeserializationContext?
        ): String? {
            return StringEscapeUtils.unescapeHtml4(json.asString)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      相关资源
      最近更新 更多