我使用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转义的合成符号的转义?
答案 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解码将很简单。