Gson的自定义序列化程序和反序列化程序可以获得类/字段吗?

rks48beu  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(217)

我正在考虑换到Gson。
根据我的初学者知识,我知道有两种方法可以实现自定义序列化程序和反序列化程序:

  1. JsonSerializerJsonDeserializer,以及
  2. TypeAdaptor .
    请考虑以下事项:
public class Pojo {
  @JsonAdaptor(MyCustomAdaptor.class)
  private Integer number;
}

class MyCustomAdaptor extends TypeAdaptor<Integer> {
  @Override
  public Integer read(JsonReader in) throws IOException {
    // ...
  }

  public void write(JsonWriter writer, Integer value) throws IOException {
    // ...
  }
}

我注意到TypeAdaptor没有公开numberFieldJsonSerializerJsonDeserializer也不是这样。我知道当这些类在封送/解送生命周期中使用时,没有必要知道这些信息。
现在,让我们假设FieldTypeAdaptor中公开。下面是我将执行的基本示例:

public class Pojo {
  @JsonAdaptor(MyCustomAdaptor.class)
  @FloatSerialize
  private Number number;
}

class MyCustomAdaptor extends TypeAdaptor<Number> {
  @Override
  public Number read(JsonReader in, Field field) throws IOException {
    // Do something if @FloatSerialize is present.
  }

  public void write(JsonWriter writer, Number value, Field field) throws IOException {
    // Do something if @FloatSerialize is present.
  }
}
  • 我知道这没有意义,因为@JsonAdaptor可以用于类和字段。*

而且,我知道有更好的方法来完成上面的例子;这只是一个示例,没有任何意义。基本上,我希望使用注解,在每个字段的基础上,告诉自定义的序列化程序/反序列化程序如何处理。
这在Gson中可能吗?你能创建一个自定义的序列化器/反序列化器来公开带注解的类/字段/等等吗?

7rtdyuoh

7rtdyuoh1#

@JsonAdaptor(MyCustomAdaptor.class)
private Integer number;

您已经为Integer字段添加了注解。
我注意到TypeAdaptor不公开数字字段
我想你误会了什么。
您提供TypeAdaptor,并赋予它与您的字段相同的型别:
public void write(JsonWriter writer, Integer value) throws IOException
然后在序列化时,您将已注解的java对象作为输入序列化为字符串,然后您将字段直接用作参数中的'value':
public void write(JsonWriter writer, Integer value) throws IOException
在反序列化时,你有一个json字符串作为输入来反序列化到你已经注解的对象。在类型适配器中,这个对象是你的字段,这就是为什么read方法返回一个Integer。
Integer read(JsonReader in) throws IOException
由您决定是否从JsonReader返回Integer。
您可以在字段中使用数字而不是整数,然后您可以在字段中使用浮点型、整数型、短整型和更多类型。
为此,您需要携带一个数字适配器:

class MyCustomAdaptor extends TypeAdaptor<Number> {

    Number read(JsonReader in, Field field) throws IOException;

    void write(JsonWriter writer, Number value) throws IOException; 
}

如果你真的想考虑“场”,那么就为整个对象提供一个适配器:

class Pojo Adaptor extends TypeAdaptor< Pojo > {

  Pojo read(JsonReader in) throws IOException;

  void write(JsonWriter writer, Pojo value) throws IOException;
}

然后,您可以访问整个对象及其在适配器中的字段。
与JsonSerializer/JsonDeserialize相同。

vs91vp4v

vs91vp4v2#

使用您的其他信息:

class Pojo Adaptor extends TypeAdaptor< Pojo > {

  Pojo read(JsonReader in) throws IOException{
for(Field f: Pojo.class.getDeclaredFields()){
            f.steAccessible();
            for(Annotation a : f.getAnnotations()){
                // Do what you want here withe the field and its annotation
            }
    }

  void write(JsonWriter writer, Pojo value) throws IOException{

        for(Field f: Pojo.class.getDeclaredFields()){
            f.steAccessible();
            for(Annotation a : f.getAnnotations()){
                // Do what you want here with the field and its annotation
            }
        }
    }
}

这是我凭记忆写的但你已经明白了

相关问题