【问题标题】:Subclass as json parent object子类作为 json 父对象
【发布时间】:2018-11-15 13:25:56
【问题描述】:

我有一个要求,在创建 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"
  }
}

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

【问题讨论】:

    标签: java json jackson fasterxml


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的解决方案,我也有类似的想法,但如果有人对问题有一些标准的解决方案,我仍然想等待。
    • @foxt7ot Np。我也很好奇有人会如何以其他方式解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2018-10-08
    • 2021-03-16
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多