如何让 Retrofit 取消转义 HTML 个转义符号?
How to have Retrofit to unescape HTML escaped symbols?
我使用 Retrofit2 和 GSON 反序列化传入的 JSON。这是我在 Android app:
中的代码
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 有文本时:
Healh & Fitnesss
它按原样反序列化。
但我需要得到这个:
Healh & 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
。有了它,您可以根据 class 决定是否要将某种类型的适配器应用到那个 class。因此,例如,如果您的 POJO 继承了一些公共基础 class,那么检查 class 是否扩展了该基础 class 和 return 适配器(如 HtmlAdapter
以应用将很简单HTML 在 class.
中解码 String
秒
我使用 Retrofit2 和 GSON 反序列化传入的 JSON。这是我在 Android app:
中的代码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 有文本时:
Healh & Fitnesss
它按原样反序列化。
但我需要得到这个:
Healh & 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
。有了它,您可以根据 class 决定是否要将某种类型的适配器应用到那个 class。因此,例如,如果您的 POJO 继承了一些公共基础 class,那么检查 class 是否扩展了该基础 class 和 return 适配器(如 HtmlAdapter
以应用将很简单HTML 在 class.
String
秒