Как сделать Retrofit, чтобы скрыть экранированные символы HTML? - PullRequest
0 голосов
/ 26 сентября 2018

Я использую 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 имеет текст:

Healh & Fitnesss

десериализовано как есть.

Но мне нужно получить это:

Healh& Fitnesss

Как получить Retrofit для автоматического удаления экранированных символов HTML?

1 Ответ

0 голосов
/ 26 сентября 2018

В качестве общего ответа это можно сделать с помощью пользовательского 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, чтобы применить декодирование HTML для String s в этом классе.

...