Как получить настроенный JSON Object в Spring Загрузочный метод Api post - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь получить объект JSON в @RequestBody, который мне не известен, т. Е. Объект JSON может иметь любую длину и данные.

Допустим, JSON может быть таким, как показано ниже

{'seqNo': 10 }

{'country': 'US', 'state': 'CA'}

{'customer': 'Alex', product: 'UPS', date:'25-Mar-2018'}

И в Spring Boot Api у меня есть метод для получения этого объекта JSON.

@PostMapping(value = "/lookup")
public ResponseEntity<AppResponse> getLookup(@RequestBody LookupRequestObject lookupRequestObject) {

        // THIS METHOD KNOWS WHICH FIELD TO USE
        // FURTHER LOGIC WOULD BE HERE.


        return ResponseEntity.ok(response);

    }

Я читал о сериализации Джексона, но все еще не нашел решения для этого.

Настройка Джексона ObjectMapper

Любая помощь будет высоко ценится.

Ответы [ 3 ]

3 голосов
/ 02 апреля 2019

Вы можете просто использовать карту для ввода.Затем вы можете получить доступ к полю на карте в зависимости от того, какие поля он содержит.

@PostMapping(value = "/lookup")
public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> lookupRequestObject) {

    // THIS METHOD KNOWS WHICH FIELD TO USE
    // FURTHER LOGIC WOULD BE HERE.

    return ResponseEntity.ok(response);
}
1 голос
/ 02 апреля 2019

Ответ @Patrick Adler абсолютно правильный.Вы можете использовать карту в качестве параметра метода.Два важных дополнения: Map соответствует JSON Object, поэтому, когда JSON-объект передается в ваш метод Spring (по умолчанию используется Jackson), он преобразует его в map, поэтому дополнительный код не требуется.Также, чтобы быть уверенным, что вы можете добавить к своей аннотации, что ожидаете получить ввод JSON: измените строку

@PostMapping(value = "/lookup")

на

@PostMapping(value = "/lookup", headers = "Accept=application/json")

И, наконец, введенный вами ввод не являетсядопустимый одиночный объект JSON.Это 3 отдельных объекта JSON.Так что вы ожидаете массив JSON, содержащий объекты JSON, или один объект JSON.Если вы ожидаете JSON Array, то вместо параметра Map<String, Object> в вашем методе используйте List<Map<String, Object>>, поэтому ваше решение должно выглядеть либо

@PostMapping(value = "/lookup", headers = "Accept=application/json")
public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> lookupRequestObject) {

    // THIS METHOD KNOWS WHICH FIELD TO USE
    // FURTHER LOGIC WOULD BE HERE.

    return ResponseEntity.ok(response);
}

, либо таким же, но с параметром List<Map<String, Object>>вместо просто карты
1 голос
/ 02 апреля 2019

Если структура JSON object неизвестна, вы всегда можете использовать тип Map<String, Object> и преобразовать его в POJO или напрямую работать с Map.Если вам нужен POJO, вы можете использовать convertValue метод:

@PostMapping(value = "/lookup")
public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> payload) {
    // read map
    ObjectMapper objectMapper = new ObjectMapper();
    if (payload.containsKey("seqNo")) {
        Sequence seq = objectMapper.convertValue(payload, Sequence.class);
        // other logic
    } else if (payload.containsKey("country")) {
        Country country = objectMapper.convertValue(payload, Country.class);
    }
    // the same for other types

    // FURTHER LOGIC WOULD BE HERE.
    return ResponseEntity.ok(response);
}

Вы также можете попробовать десериализацию до com.fasterxml.jackson.databind.JsonNode, но он связывает контроллер с Jackson, что не хорошо с другой стороны.

...