Java Джексон десериализует объекты с одинаковыми именами, но разными типами классов - PullRequest
0 голосов
/ 27 июня 2018

У меня есть POJO, которые используются в качестве объекта запроса и ответа в REST API, например, так (я знаю, что дубликат @JsonProperty не является синтаксически правильным, см. Ниже):

public class Request {

    @JsonProperty("patient")
    PatientObjectA patientA;

    @JsonProperty("patient")
    PatientObjectB patientB;
}

public class PatientObjectA {
    @JsonProperty("identifier")
    Private Identifier identifier

    @JsonProperty("system")
    Private String system;

    @JsonProperty("value")
    Private String value;
}

public class PatientObjectA {
    @JsonProperty("identifier")
    Private List<Identifier> identifier

    @JsonProperty("system")
    Private String system;

    @JsonProperty("value")
    Private String value;
}

Существуют небольшие различия в количестве элементов в том, что я хочу иметь возможность потреблять, т. Е. Иногда объект "Пациент" будет (PatientObjectA в классе запроса):

"patient": {
  "identifier": {
    "type": {
      "coding": {
        "system": "NA",
        "code": "Patient"
      },
      "text": "Patient"
    },
    "system": "Patient",
    "value": "000000000"
  }
}

или в этом случае (обратите внимание на различия в количестве элементов в объекте идентификатора, где в этом случае идентификатор может иметь один или несколько элементов) (PatientBObject в классе Request):

    "patient": {
      "identifier": [{
         "type": {
          "coding": {
            "system": "NA",
            "code": "Patient"
          },
          "text": "Patient"
        },
        "system": "Patient",
        "value": "3018572032"
      }]
    }

Я хотел бы добиться функциональности, когда запросы отображаются на правильные объекты. Есть ли способ (кроме пользовательского десериализатора), где я могу сопоставить запросы к соответствующему объекту по типу / количеству элементов? Любое понимание будет оценено!

1 Ответ

0 голосов
/ 27 июня 2018

Джексон поддерживает это с помощью аннотации @JsonTypeInfo.

Я рекомендую указать информацию о типе в свойстве (поле json) и использовать полное имя класса (в отличие от короткого имени), чтобы обеспечить лучшую гарантию уникальности:

@JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") public class PatientObjectA { ..

Выход A выглядит так: "patient": { "jsonType": "com.company.PatientAObject" "identifier": { "type": { "coding": { "system": "NA", "code": "Patient" }, "text": "Patient" }, "system": "Patient", "value": "000000000" } } Выход B выглядит так: "patient": { "jsonType": "com.company.PatientBObject" "identifier": { "type": { "coding": { "system": "NA", "code": "Patient" }, "text": "Patient" }, "system": "Patient", "value": "000000000" } }

Примечание: Кроме того, проверьте @JsonRootName, поскольку это даст вам возможность создавать «укорененный» объект json без необходимости иметь тот объект-обертку, который у вас есть.

@JsonRootName("Patient") @JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") public class PatientObjectA { ..

.. и ..

@JsonRootName("Patient") @JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") public class PatientObjectB { ..

Связанные термины, чтобы помочь с дополнительными исследованиями:

  • полиморфизм в JSON
  • json эквивалент пространств имен xml.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...