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

时间:2018-09-26 15:34:08

标签: java android gson retrofit2 html-escape

我使用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具有文本时:

  

健康&健身

按原样反序列化。

但是我需要得到这个:

  

健康与健身

如何使Retrofit自动取消对HTML转义的合成符号的转义?

1 个答案:

答案 0 :(得分:1)

作为通用答案,可以使用自定义title.slugs完成,例如:

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字段,可能不是性能问题。

要获得更复杂的解决方案,您还可以查看TypeAdapterFactory。有了它,您可以决定是否要对每个类应用某种类型的适配器。因此,例如,如果您的POJO继承了一些公共基类,则检查类是否扩展了该基类并返回适配器String以便对该类中的HtmlAdapter进行HTML解码将很简单。