子类作为json父对象

时间:2018-11-15 13:25:56

标签: java json jackson fasterxml

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

EventBase

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

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

1 个答案:

答案 0 :(得分:0)

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

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