繁体   English   中英

如何进行翻新以使HTML转义符号转义?

[英]How to have Retrofit to unescape HTML escaped symbols?

我使用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转义的符号,例如& 改造并非无法避免。

例如,当传入的json具有文本时:

健康与 Fitnesss

它按原样反序列化。

但是我需要得到这个:

健康与健身

如何获得Retrofit来自动使HTML转义的合成符号转义?

作为通用答案,可以使用定制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以对该类中的String进行HTML解码将很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM