Извлечение Java-объектов из почтового запроса json - PullRequest
0 голосов
/ 14 октября 2019

Я разрабатываю спокойное веб-приложение, используя java и jax-rs. На серверной стороне я должен принимать запросы типа Json, которые были предоставлены клиентом с использованием метода POST.

@POST
@Path("/Request")
@Consumes(MediaType.APPLICATION_JSON)
public String process(SMessage message) throws Exception  {
         message.getHeader();
         message.getBody();
}

Объект json имеет два составных поля, как в следующем формате.

{
  "header": {
    "serviceType": "A"
  },
  "body": {
    "id": "1",
    "name": "abc"
  }
}

В зависимости от значения serviceType, указанного в поле Header, параметры в теле будут отличаться. Мне нужно сопоставить это поле тела с классом Java POJO. Класс POJO не одинаков для всех запросов. Как я могу добиться этого эффективно?

1 Ответ

1 голос
/ 21 октября 2019

Если вы используете Jackson в качестве анализатора JSON, простой способ объявить body как JsonNode для обработки динамических ключей следующим образом:

class MyResponse {
    private MyHeader header;
    private JsonNode body;

    //general getters and setters
}

И я предположил, чтоу вас уже есть POJO для header, например:

class MyHeader {
    private String serviceType;

    //general getters and setters
}

Наконец, давайте проверим, работает ли он:

String responseStr = "{\"header\": {\"serviceType\": \"A\"},\"body\": {\"id\": \"1\",\"name\": \"abc\"}}";

ObjectMapper mapper = new ObjectMapper();
MyResponse myResponse = mapper.readValue(responseStr, MyResponse.class);
System.out.println(myResponse.getBody().get("name").asText());

Вывод на консоль:

abc

Еще один способ решить эту проблему - использовать Map, а все остальное - то же:

class MyResponse {
    private MyHeader header;
    private Map<String, Object> body;

    //general getters and setters
}
...