Gson原理简析

Gson可以方便的用来进行json转换

  1. 排除策略
    自动排除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;
            }
        };
  1. 字段处理
    对某些字段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);
  1. 转义,启用空字段
    可以直接配置disableHtmlEscaping(转换为unicode),serializeNulls

  2. 字符串中的引号
    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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值