【问题标题】:How to have Retrofit to unescape HTML escaped symbols?如何让 Retrofit 取消转义 HTML 转义符号?
【发布时间】:2019-03-02 10:50:44
【问题描述】:

我使用 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 转义的 synbol?

【问题讨论】:

  • 为什么要 Retrofit 来做这项工作?从Retrofit 中获得here 这样的字符串后,您不能只在java 中取消转义字符串吗?还是有可能的。
  • 我有大约 20 个 Pojo。他们每个人都使用改造来获得响应。我不想在 20 个地方这样做。我想把这个放在一个地方。

标签: java android gson retrofit2 html-escape


【解决方案1】:

作为通用答案,这可以通过自定义 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-07-30
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2015-05-16
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多