欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据解析_Gson

程序员文章站 2022-03-21 13:21:36
简单使用//反序列化new Gson().fromJson("", Object.class);//序列化new Gson().toJson(Object);在序列化和反序列化时,是用JsonReader和JsonWriter 来实现的,这边可以自己使用它们来手写具体是在类的上面加上注解@JsonAdapter(自定义的TypeAdapter.class) ,然后直接new Gson即可。也可以通过GsonBuilder的registerTypeAdapter来设置一个TypeAdapter...

简单使用

//反序列化
new Gson().fromJson("", Object.class);
//序列化
new Gson().toJson(Object);
在序列化和反序列化时,是用JsonReader和JsonWriter 来实现的,这边可以自己使用它们来手写
具体是在类的上面加上注解@JsonAdapter(自定义的TypeAdapter.class) ,然后直接new Gson即可。
也可以通过GsonBuilder的registerTypeAdapter来设置一个TypeAdapter,在自定义的TypeAdapter的write和read方法中实现自己想要的序列化和反序列化代码,如果只想接管其中某个过程可以将TypeAdapter换成JsonSerializer(序列化)与JsonDeserializer(反序列化)
如果想要将整数转成字符串,用registerTypeAdapter需要多次调用,可以使用registerTypeHierarchyAdapter,type传Number.class

属性名称修改或者冲突

为了避免属性值变更可以使用@SerializedName(value = "别名1", alternate = {"别名2", "别名3"})
alternate为可选

泛型传class

如果Object.class是泛型则会出现问题,无法解析
比如List<String> 这个传入List<String>.class 只会被当成List.class
解决方式是:new Gson().fromJson("", new TypeToken<List<String>>() {}.getType()));
这个对于android接口返回数据处理很有用
{
	"code":"0",
	"msg" : "success",
	"data":
}
这边的data是各种各样的,所以可以直接使用泛型,在fromJson的时候使用TypeToken来传
public class Result<T> {
	public int code;
	public String message;
	public T data;
}

其他异常场景处理

  1. 当某个对象的某个属性为null,在tojson时这个属性会消失
    这时使用GsonBuilder可以设置序列化时的要求,.serializeNulls()可以完整输出该属性并且值为null
Gson gson = new GsonBuilder()
        //序列化null
        .serializeNulls()
        // 设置日期时间格式,另有2个重载方法
        // 在序列化和反序化时均生效
        .setDateFormat("yyyy-MM-dd")
        // 禁此序列化内部类
        .disableInnerClassSerialization()
        //生成不可执行的Json(多了 )]}' 这4个字符)
        .generateNonExecutableJson()
        //禁止转义html标签
        .disableHtmlEscaping()
        //格式化输出
        .setPrettyPrinting()
        .create();
  1. 当类的某个属性不需要序列化或者反序列化时可以使用@Expose注解
    @Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效,等价于上一条
    @Expose(deserialize = true,serialize = false) //反序列化时生效
    @Expose(deserialize = false,serialize = true) //序列化时生效
    @Expose(deserialize = false,serialize = false) // 和不写注解一样

    这时不能new Gson,应该用

Gson gson = new GsonBuilder()
        .excludeFieldsWithoutExposeAnnotation()
        .create();
  1. 类在不同版本时拥有的属性可能不一样,这时可以使用注解@Since(double)和@Until(double)来表明属性可以被序列化或反序列化的版本
    版本通过GsonBuilder的.setVersion(Double)来设置

  2. 类中某种修饰符不想被序列化或者反序列化时可以使用GsonBuilder的excludeFieldsWithModifiers来排除

new GsonBuilder()
        .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PRIVATE)
        .create();

不会序列化或者反序列化,final、static、private修饰的属性
自定义排除类型addSerializationExclusionStrategy添加序列化排除属性,addDeserializationExclusionStrategy 添加反序列化排除属性

Gson gson = new GsonBuilder()
        .addSerializationExclusionStrategy(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes f) {
                // 这里作判断,决定要不要排除该字段,return true为排除
                if ("finalField".equals(f.getName())) return true; //按字段名排除
                Expose expose = f.getAnnotation(Expose.class); 
                if (expose != null && expose.deserialize() == false) return true; //按注解排除
                return false;
            }
            @Override
            public boolean shouldSkipClass(Class<?> clazz) {
                // 直接排除某个类 ,return true为排除
                return (clazz == int.class || clazz == Integer.class);
            }
        })
        .create();

本文地址:https://blog.csdn.net/qq_37658380/article/details/107462113