服务器响应的正确解码
Proper decoding of server response
在我的应用程序中,我使用 Retrofit+Gson 与服务器通信。但是,服务器响应存在编码问题。
在 OkHttp 日志记录拦截器服务器响应看起来像这样,这没问题:
... "name":"S\u0026#39;mores" ...
这是服务器响应的一部分 JSON。当响应被 Gson 反序列化时,反序列化后的字符串如下所示:
S'mores
我想知道反序列化过程中发生了什么,以及如何正确编码字符串。
下面是我的 Retrofit 初始化代码:
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
Unicode \u0026
指的是十六进制值 26,或十进制的 38。 ASCII 38 表示一个符号 (&)。
https://www.ascii-code.com/
好吧,我找到了类似的旧问题的答案:
就像那里一样,我创建了自定义反序列化器:
class HtmlDeserializer: JsonDeserializer<String> {
@Throws(JsonParseException::class)
override fun deserialize(
json: JsonElement, typeOfT: Type?,
context: JsonDeserializationContext?
): String? {
return StringEscapeUtils.unescapeHtml4(json.asString)
}
}
在我的应用程序中,我使用 Retrofit+Gson 与服务器通信。但是,服务器响应存在编码问题。
在 OkHttp 日志记录拦截器服务器响应看起来像这样,这没问题:
... "name":"S\u0026#39;mores" ...
这是服务器响应的一部分 JSON。当响应被 Gson 反序列化时,反序列化后的字符串如下所示:
S'mores
我想知道反序列化过程中发生了什么,以及如何正确编码字符串。
下面是我的 Retrofit 初始化代码:
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
Unicode \u0026
指的是十六进制值 26,或十进制的 38。 ASCII 38 表示一个符号 (&)。
https://www.ascii-code.com/
好吧,我找到了类似的旧问题的答案:
就像那里一样,我创建了自定义反序列化器:
class HtmlDeserializer: JsonDeserializer<String> {
@Throws(JsonParseException::class)
override fun deserialize(
json: JsonElement, typeOfT: Type?,
context: JsonDeserializationContext?
): String? {
return StringEscapeUtils.unescapeHtml4(json.asString)
}
}