正确解码服务器响应[重复]
Posted
技术标签:
【中文标题】正确解码服务器响应[重复]【英文标题】: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
【问题讨论】:
【参考方案1】:unicode \u0026
指的是十六进制值 26,或十进制的 38。 ASCII 38 表示与号 (&)。
https://www.ascii-code.com/
【讨论】:
是的,谢谢。现在我看到服务器发送 HTML 编码数据,然后以 utf-8 编码。那么,如何使用 Gson+Retrofit 来解码呢?【参考方案2】:好吧,我找到了类似旧问题的答案: https://***.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)
【讨论】:
以上是关于正确解码服务器响应[重复]的主要内容,如果未能解决你的问题,请参考以下文章
#2002 - 服务器没有响应(或者本地 MySQL 服务器的套接字配置不正确)[重复]
Angular 8 使用正确的数据显示 HTTP 响应。 ([对象对象])[重复]