Gson可以方便的用来进行json转换
- 排除策略
自动排除transitant字段,
可以添加@Expose保留某个字段,
也可以使用excludeFieldsWithModifiers排除某种modifier的所有字段,
同时可以使用下面方法排除下划线开头的字段
ExclusionStrategy myExclusionStrategy = new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes fa) {
return fa.getName().startsWith("_");
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
};
- 字段处理
对某些字段gson的处理不太一样,比如不能将long转换到Date,需要如下处理
public class DateSerializer implements JsonSerializer<Date> {
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.getTime());
}
}
public class DateDeserializer implements JsonDeserializer<java.util.Date> {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new java.util.Date(json.getAsJsonPrimitive().getAsLong());
}
}
gb.registerTypeAdapter(java.util.Date.class, new DateSerializer()).setDateFormat(DateFormat.LONG);
gb.registerTypeAdapter(java.util.Date.class, new DateDeserializer()).setDateFormat(DateFormat.LONG);
转义,启用空字段
可以直接配置disableHtmlEscaping(转换为unicode),serializeNulls字符串中的引号
gson在序列化字符串时,会强制转义一些字符,添加反斜杠, 相关代码在JsonWriter中,这时就需要自定义TypeAdapter来处理,如下:
TypeAdapter<String> STRING = new TypeAdapter<String>() {
@Override
public String read(JsonReader in) throws IOException {
JsonToken peek = in.peek();
if (peek == JsonToken.NULL) {
in.nextNull();
return null;
}
/* coerce booleans to strings for backwards compatibility */
if (peek == JsonToken.BOOLEAN) {
return Boolean.toString(in.nextBoolean());
}
return in.nextString();
}
@Override
public void write(JsonWriter out, String value) throws IOException {
//out.value(value);
if(value == null){
out.jsonValue(value);
}else{
out.jsonValue("\""+value+"\"");
}
}
};
gb.registerTypeAdapter(String.class, STRING);