Подкласс как родительский объект json - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть требование, когда мне нужен подкласс в качестве объекта при создании полезной нагрузки 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 голосов
/ 16 ноября 2018

Самое близкое, что я мог получить, столкнувшись с подобной проблемой, это создать класс адаптера.Это решение печатает одно дополнительное свойство, которое может быть проигнорировано, если, например, разрешено некоторое наследование, но я предполагаю, что нет, и использую только объявленные классы в дополнение к адаптеру, например:

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