微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jackson JSON反序列化包装对象

如何解决Jackson JSON反序列化包装对象

我正在读取REST-API,该API以以下方式返回结果

{
  "total": 2,"results": [
    {
      "name": "object-name","id": 123
    },{
      "name": "another-object-name","id": 321
    }
  ]
}

除了属性nameid之外,results的元素还包括其他属性,具体取决于对象类型。 results中的所有对象都是同一类型。没有属性指示元素是什么对象类型。

我正在使用Apache Beam,并且正在将Autovalue与Jacksonjson一起使用来解析这些对象。例如,对象Circle如下所示:

@JsonDeserialize(builder = Autovalue_Circle.Builder.class)
@Autovalue
public abstract class Circle implements Serializable {

  public static Circle.Builder builder() {
    return Circle.Builder.builder();
  }

  @JsonProperty("name")
  public abstract String name();

  @JsonProperty("id")
  public abstract int id();

  @JsonProperty("radius")
  public abstract double radius();

  @JsonPOJOBuilder(buildMethodName = "build")
  @Autovalue.Builder
  public abstract static class Builder {

    @JsonCreator
    public static Builder builder() {
      return new Autovalue_Circle.Builder();
    }

    @JsonProperty("name")
    abstract Builder name(String name);

    @JsonProperty("id")
    abstract Builder id(int id);

    @JsonProperty("radius")
    abstract Builder radius(double radius);

    abstract Circle build();
  }
}

我知道results中包含什么类型。例如,从/api/circles发出GET请求将返回一个圈子列表。

我正在使用Apache Beam管道来处理此问题:

// jsonData is a PCollection<String>,which holds JSONs
PCollection<ApiWrapperObj> data = jsonData.apply(ParseJsons.of(ApiWrapperObj.class).setCoder(SerializableCoder.of(ApiWrapperObj.class));

所以我需要为包装对象创建一个反序列化器。我有办法使用通用类吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。