首页 > 解决方案 > 子类作为 json 父对象

问题描述

我有一个要求,在创建 json 有效负载时需要一个子类作为对象。

事件库

public class EventBase {
    @JsonProperty("event_id")
    private String id;
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

PaymentCapture(子类)

@JsonTypeName("resource")
public class PaymentCapture extends EventBase {
    @JsonProperty("parent_payment")
    private String parentPayment;

    public String getParentPayment() {
        return parentPayment;
    }

    public void setParentPayment(String parentPayment) {
        this.parentPayment = parentPayment;
    }
}

我需要以下形式的 json 有效负载:

{
   "id": "someId",
   "resource": {
         "parent_payment": "23434"
  }
}

我可以理解这违反了继承关系,但只想知道是否有任何可用的解决方案。

标签: javajsonjacksonfasterxml

解决方案


遇到类似问题时我能得到的最接近的方法是创建一个适配器类。此解决方案打印一个额外的属性,例如,如果允许某些继承,则可能会忽略该属性,但我假设不允许,并且除了适配器之外仅使用声明的类,例如:

@RequiredArgsConstructor
public class PaymentCaptureAdapterClass {
    @NonNull
    @JsonProperty
    private PaymentCapture resource;

    @JsonProperty
    private String getId() {
        return resource.getId();
    }
}

将其与代码一起使用:

ObjectMapper om = new ObjectMapper();
om.enable(SerializationFeature.INDENT_OUTPUT);
PaymentCapture pc = new PaymentCapture();

pc.setId("someId");
pc.setParentPayment("23434");

log.info("\n{}", om.writeValueAsString(new AdapterClass(pc)));

打印类似:

{
  "resource" : {
    "event_id" : "someId",  // might be able to be ignored
    "parent_payment" : "23434"
  },
  "id" : "someId"
}

推荐阅读