繁体   English   中英

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

[英]Can Gson's custom serializers and deserializers get the class/field?

我正在考虑切换到 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没有公开numberField JsonSerializerJsonDeserializer也不是这种情况。 我知道当这些类用于编组/解组生命周期时,不需要知道这些信息。

暂时,让我们假设Field暴露在TypeAdaptor中。 以下是我会做的一个基本示例:

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 这可能吗? 您可以创建一个自定义序列化器/反序列化器来公开带注释的类/字段/等吗?

@JsonAdaptor(MyCustomAdaptor.class)
private Integer number;

您已注释 Integer 字段。

我注意到 TypeAdaptor 没有公开数字的字段

我认为你误解了一些东西。

你提供 TypeAdaptor,你给它与你的字段相同的类型:

class MyCustomAdaptor extends TypeAdaptor<Integer>

然后在序列化时,您将 java 对象注释为输入以序列化为字符串,然后您的字段可直接用作参数中的“值”:

public void write(JsonWriter writer, Integer value) throws IOException

在反序列化时,您有一个 json 字符串作为输入以反序列化到您已注释的 object。 在类型适配器中,这个 object 是您的字段,这就是 read 方法返回 Integer 的原因。

Integer read(JsonReader in) throws IOException

从 JsonReader 返回 Integer 由您决定。

您可以在您的字段中使用数字而不是 Integer,然后您可以在您的字段中使用浮点数、integer 等。

为此,您需要带一个 NumberAdaptor:

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;
}

然后您可以访问整个 object 及其在适配器中的字段。

与 JsonSerializer/JsonDeserialize 相同。

使用您的附加信息:

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
            }
        }
    }
}

我是从我的 memory 写的,但你明白了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM