如何在Java中正确解析SES退回JSON SNS通知

PHP*_*ger 1 java json amazon-sns amazon-ses objectmapper

我正在从SNS主题接收JSON,我认为这是不正确的

{
   "Type":"Notification",
   "MessageId":"message-id-is-this",
   "TopicArn":"bouncer.topic.name.here",
   "Message":"{\"notificationType\":\"Bounce\",\"bounce\":{\"bounceType\":\"Permanent\",\"bounceSubType\":\"General\",\"bouncedRecipients\":[{\"emailAddress\":\"bounce@simulator.amazonses.com\",\"action\":\"failed\",\"status\":\"5.1.1\",\"diagnosticCode\":\"smtp; 550 5.1.1 user unknown\"}],\"timestamp\":\"2017-04-24T12:58:05.716Z\",\"feedbackId\":\"feedback.id.is.here\",\"remoteMtaIp\":\"192.168.10.1\",\"reportingMTA\":\"dsn; smtp.link.here\"},\"mail\":{\"timestamp\":\"2017-04-24T12:58:05.000Z\",\"source\":\"senderEmail@domainname.com\",\"sourceArn\":\"arn:aws:ses:us-east-1:someid:identity/some@domain.org\",\"sourceIp\":\"127.0.0.1\",\"sendingAccountId\":\"sending.account.id.is.this\",\"messageId\":\"message-id-is-this\",\"destination\":[\"bounce@simulator.amazonses.com\"]}}",
   "Timestamp":"2017-04-24T12:58:05.757Z",
   "SignatureVersion":"1",
   "Signature":"signature.link",
   "SigningCertURL":"certificate.link.here",
   "UnsubscribeURL":"un.subscribe.link"
}
Run Code Online (Sandbox Code Playgroud)

问题出在“消息”属性,而不是持有对象,而是引用对象的字符串

包含

"Message":"{\"key\":\"value\"}"
Run Code Online (Sandbox Code Playgroud)

代替

"Message":{"key":"value"}"
Run Code Online (Sandbox Code Playgroud)

因此没有映射到Message类

我暂时通过接收到字符串变量来解决此问题,然后将其转换

private String Message;
private Message objMessage;
Run Code Online (Sandbox Code Playgroud)

然后

Notification noti = toObject(jsonString, Notification.class);
Message msg = toObject(noti.getMessage(), Message.class);
noti.setObjMessage(msg);
Run Code Online (Sandbox Code Playgroud)

为了进行转换,我正在使用ObjectMapper.readValue(...)

解决此问题的正确方法是什么?

Mic*_*bot 5

此格式正确。

循环中有两个独立的服务,即SES和SNS。

外部结构是SNS通知-SNS使用的通用结构可以交付SNS 交付的任何内容

它包含一个Message属性,其值始终为字符串,因为这是SNS传递的消息类型-字符串。不是对象。SNS并不知道该Message属性的值是任何种类的对象。可以是任何东西,只要它是有效的UTF-8,SNS都不在乎。

要以字符串形式交付对象,必须对其进行序列化...并且内部序列化也恰巧是JSON。

所以Message嵌套JSON功能于JSON。

这就是它的外观。

序列化外部对象时,必须转义内部保留的JSON字符,如下所示。第一次反序列化之后,您便拥有了SES发送给您的确切信息-JSON字符串。

然后,您需要反序列化结果字符串以获取对象。

我不认为您做错了。如果是,那么多年来我一直做错了。