为了账号安全,请及时绑定邮箱和手机立即绑定

如何让 Retrofit 对 HTML 转义符号进行转义?

如何让 Retrofit 对 HTML 转义符号进行转义?

PIPIONE 2021-10-13 13:53:25
我使用 Retrofit2 和 GSON 来反序列化传入的 JSON。这是我在 Android 应用程序中的代码:public class RestClientFactory {    private static GsonBuilder gsonBuilder = GsonUtil.gsonbuilder;    private static Gson gson;    private static OkHttpClient.Builder httpClient;    private static HttpLoggingInterceptor httpLoggingInterceptor         = new HttpLoggingInterceptor()            .setLevel(HttpLoggingInterceptor.Level.BASIC);    static {       gsonBuilder.setDateFormat(DateUtil.DATETIME_FORMAT);        httpClient = new OkHttpClient.Builder();        gson = gsonBuilder.create();    }    private static Retrofit.Builder builder = new Retrofit.Builder()            .baseUrl(BuildConfig.API_BASE_URL)            .addConverterFactory(GsonConverterFactory.create(gson))            .client(httpClient.build());    private static Retrofit retrofit = builder.build();}如果传入的 JSON 中有任何 HTML 转义符号,例如&Retrofit 不会对其进行转义。例如,当传入的 json 有文本时:健康& 健身它按原样反序列化。但我需要得到这个:健康与健身如何让 Retrofit 自动取消转义 HTML 转义符?
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

作为通用答案,这可以通过 custom 完成JsonDeserialiser,例如:


public class HtmlAdapter implements JsonDeserializer<String> {


    @Override

    public String deserialize(JsonElement json, Type typeOfT, 

                                  JsonDeserializationContext context)

        throws JsonParseException {

        return StringEscapeUtils.unescapeHtml4(json.getAsString());

    }


}

并添加


gsonBuilder.registerTypeAdapter(String.class, new HtmlAdapter())

到您的静态块。方法StringEscapeUtils.unescapeHtml4来自外部库,org.apache.commons, commons-text但你可以用任何你感觉更好的方式来做。


这个特定适配器的问题在于它适用于所有反序列化的String字段,这可能是也可能不是性能问题。


要获得更复杂的解决方案,您还可以查看TypeAdapterFactory. 有了它,您可以决定每个类是否要将某种类型适配器应用于该类。因此,例如,如果您的 POJO 继承了一些公共基类,那么检查类是否扩展了该基类并返回适配器就像在该类中HtmlAdapter为Strings应用 HTML 解码一样简单。


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 282 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信