Парсинг ответа от сервиса Mailgun в Java объект

305
25 мая 2017, 08:58

Не выходит распарсить ответ. Интересует объект message, необходимо свойство "message-id". Заранее спасибо за помощь и советы!

{
   "tags": [],
   "message": {
      "headers": {
         "to": "yu@mail.ru",
         "message-id": "20170523133300.17012.6289DB38@va.com",
         "from": "Aa Support <customer@va.com>",
         "subject": "Welcome to Ava Online Provider Portal"
      },
      "attachments": [],
      "size": 11659
   },
   "recipient": "yu@mail.ru",
   "event": "delivered"
} 

controller

@RequestMapping(value = "mailgun/webhook/delivered",  method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void maigunWebhook(Webhook webhook) throws NoSuchAlgorithmException, InvalidKeyException {
    log.warn("Webhook " + webhook);
    notificationFormService.updateStatusMail(webhook);
}

Строчка из лога

Webhook{message=null, event=delivered, recipient='yu@mail.ru'}

entity

@JsonIgnoreProperties(ignoreUnknown = true)
public class Webhook {
    public WebhookMsg message;
    private String event;
    private String recipient;
    private String timestamp;
    private String token;
    private String signature;
    GETTER & SETTER
} 
@JsonIgnoreProperties(ignoreUnknown = true)
public class WebhookMsg {
    public WebhookHeaders headers;
    GETTER & SETTER
}
public class WebhookHeaders {
   String to;
   @JsonProperty("message-id")
   String messageId;
   String from;
   String subject;
   GETTER & SETTER
}
Answer 1

Можно использовать gson для этого (https://mvnrepository.com/artifact/com.google.code.gson/gson). Для json'а, который вы привели в пример, можно использовать этот код:

String jsonContent = "содержимое json";
JsonObject jsonObj = new Gson().fromJson(jsonContent, JsonObject.class);
String messageID = jsonObj.getJSONObject("message").getJSONObject("headers").getString("message-id);
Answer 2

Вопрос возник по собственной неосведомленности. Ответ от сервиса Mailgun приходит в формате:

content-type=application/x-www-form-urlencoded

соответственно это просто набор параметров и парсит spring в соответствии с названием полей. Вопрос решился следующим кодом, может кому и пригодится:

@RequestMapping(value = "mailgun/webhook/delivered",                   
    method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void maigunWebhook(@RequestParam("Message-Id") String messageId, Webhook webhook){
    webhook.setMessageId(messageId);
    //........
}

По скольку в Java мы не можем указать имя ссылки "Message-id", пришлось парсить отдельным параметром с помощью аннотации @RequestParam с явным указанием его названия

READ ALSO
Live threads VisualVM

Live threads VisualVM

Здравсвуйте! Есть небольшое приложение на spring-boot, один из методов, который обрабатывает входящий запрос создает

318
Не получается паттерн

Не получается паттерн

Нужно определить по строке, что это счет первого сета теннисного матчаВот паттерн:

305
Ошибки компиляции

Ошибки компиляции

Помогите пожалуйстаБез введения новых полей класса и изменения модификаторов доступа устранить все ошибки компиляции

440
Создание двигающихся объектов в Java

Создание двигающихся объектов в Java

Дали задание создать ( нарисовать ) двигающийся объект в JavaКонкретное задание нарисовать фигуру относительно базовой точки ( базовая точка...

321