提问者:小点点

继承DRY响应


我有两个外部API响应类:

类A:

@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
public class ClassA {

  private SubClass subClass;

  @Getter
  @Setter
  public static class SubClass {

    Integer total;
    Integer perPage;
    List<Data> dataList;

    @Getter
    @Setter
    public static class Data {
       
      private String field1;
      private String field2;
      private int field3;
    }
  }
}

B类:

@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
public class ClassB {

  private SubClass subClass;

  @Getter
  @Setter
  public static class SubClass {

    Integer total;
    Integer perPage;
    List<Data> dataList;

    @Getter
    @Setter
    public static class Data {
       
      private String field1;
      private int field2;
      private Date field3;
    }
  }
}

并使用ObjectMapper反序列化:

  ClassA classA =
      mapper.readValue(bodyResponse, ClassA.class);

当使用继承和后来使用反序列化时,消除这些类中重复代码的最好方法是什么?


共1个答案

匿名用户

您需要使根类和子类成为通用类。使用类型引用提供所需的数据类。看看下面的例子:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.json.JsonMapper;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.Date;
import java.util.List;

public class GenericDataApp {
    public static void main(String[] args) throws JsonProcessingException {
        JsonMapper mapper = JsonMapper.builder().build();
        String srcA = "{\"subClass\":{\"total\":1,\"dataList\":[{\"field2\":\"String value\"}]}}";
        RootClass<DataA> dataA = mapper.readValue(srcA, new TypeReference<RootClass<DataA>>() {
        });
        System.out.println(dataA.getSubClass());

        String srcB = "{\"subClass\":{\"total\":1,\"dataList\":[{\"field2\":12}]}}";
        RootClass<DataB> dataB = mapper.readValue(srcB, new TypeReference<RootClass<DataB>>() {
        });
        System.out.println(dataB.getSubClass());
    }
}

@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
class RootClass<T> {

    private SubClass<T> subClass;

    @Getter
    @Setter
    @ToString
    public static class SubClass<T> {

        Integer total;
        Integer perPage;
        List<T> dataList;
    }
}

@Getter
@Setter
@ToString
class DataA {

    private String field1;
    private String field2;
    private int field3;
}

@Getter
@Setter
@ToString
class DataB {

    private String field1;
    private int field2;
    private Date field3;
}

上面的代码打印:

RootClass.SubClass(total=1, perPage=null, dataList=[DataA(field1=null, field2=String value, field3=0)])
RootClass.SubClass(total=1, perPage=null, dataList=[DataB(field1=null, field2=12, field3=null)])