Генерация объектов из JSON с полиморфизмом - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть JSON, и я хочу с ним создавать объекты.

{
  "responseId": "response-id",
  "session": "projects/project-id/agent/sessions/session-id",
  "queryResult": {
    "queryText": "End-user expression",
    "parameters": {
      "orderNumber": "PQL7648194AAAAA",
      "lastName": "RIVERO"
    },
    "action": "order",
    "allRequiredParamsPresent": true,
    "intent": {
      "name": "projects/project-id/agent/intents/intent-id",
      "displayName": "[InfoVuelo] Dia-hora de salida - datos de orden"
    },
    "languageCode": "es"
  },
  "originalDetectIntentRequest": {}
}

Поля «параметров» являются переменными. Например, для одной ситуации параметры могут быть

{
  "parameters": {
     "email":"example@example.com"
  }
}

Кроме того, у меня может быть

{
"parameters": {
        "orderNumber": "PQL7648194AAAAA",
        "lastName": "RIVERO"
    }
}

Я создал класс Parameters и 2 класса (OrderNumberAndLastNameParams и EmailParams) который расширяет Parameters

public class EmailParams implements Parameters {
    private String email;
}  

public class OrderNumberLastNameParams implements Parameters {
    private String orderNumber;

    private String lastName;
}

Мой метод для создания объектов с данным JSON файлом

public static <T> T buildBodyFromJson(String filePath, Class<T> clazz) {
    ObjectMapper myMapper = new ObjectMapper();
    T jsonMapper = null;
    try {
      jsonMapper = myMapper.readValue(new ClassPathResource(filePath).getInputStream(), clazz);
    } catch (IOException e) {
      fail(e.getLocalizedMessage());
    }
    return jsonMapper;
  }

Но когда я пытаюсь построить объект, он пытается создать экземпляр Parameter объект вместо дочерних объектов получает "Unrecognized field ... not marked as ignorable ".

1 Ответ

0 голосов
/ 05 апреля 2020

Я понимаю, что на самом деле вам не нужны два отдельных класса, проблема в том, что вам нужно сгенерировать requestbody с этим объектом, который не имеет пустых / пустых полей. Ну, есть аннотация, которая может вам помочь.

Создайте отдельный класс для параметров со всеми 3 свойствами и аннотируйте с помощью @JsonInclude (JsonInclude.Include.NON_EMPTY)

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Parameters  {
    private String email;
    private String orderNumber;
    private String lastName;
}  

This аннотация приводит к тому, что пустые или пустые поля не отображаются в создаваемом теле запроса.

...