2017-04-24 1 views
0

ich JSON von SNS Thema erhalte, die ich ist glaube nicht korrektWie richtig analysieren SES JSON SNS Benachrichtigung in Java prallte

{ 
    "Type":"Notification", 
    "MessageId":"message-id-is-this", 
    "TopicArn":"bouncer.topic.name.here", 
    "Message":"{\"notificationType\":\"Bounce\",\"bounce\":{\"bounceType\":\"Permanent\",\"bounceSubType\":\"General\",\"bouncedRecipients\":[{\"emailAddress\":\"[email protected]\",\"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\":\"[email protected]\",\"sourceArn\":\"arn:aws:ses:us-east-1:someid:identity/[email protected]\",\"sourceIp\":\"127.0.0.1\",\"sendingAccountId\":\"sending.account.id.is.this\",\"messageId\":\"message-id-is-this\",\"destination\":[\"[email protected]\"]}}", 
    "Timestamp":"2017-04-24T12:58:05.757Z", 
    "SignatureVersion":"1", 
    "Signature":"signature.link", 
    "SigningCertURL":"certificate.link.here", 
    "UnsubscribeURL":"un.subscribe.link" 
} 

Das Problem ist mit „Message“ Attribut, das stattdessen ein Objekt zu halten, ist bespannen eines Objekts mit Bezug

enthält

"Message":"{\"key\":\"value\"}" 

statt

"Message":{"key":"value"}" 

daher nicht

vorübergehend auf Message-Klasse gemappt ich dieses Problem gelöst, indem in String-Empfang Variable und dann konvertieren

private String Message; 
private Message objMessage; 

und dann

Notification noti = toObject(jsonString, Notification.class); 
Message msg = toObject(noti.getMessage(), Message.class); 
noti.setObjMessage(msg); 

für die Transformation , Verwende ich ObjectMapper.readValue (...)

Was ist der richtige Weg, um dieses Problem zu lösen?

Antwort

1

Dieses Format ist korrekt.

Es gibt zwei unabhängige Dienste in der Schleife, SES und SNS.

Die äußere Struktur ist eine SNS-Benachrichtigung - eine generische Struktur, die SNS verwendet, liefern alles, dass SNS liefert.

Es enthält ein Message Attribut, dessen Wert immer ein String ist, da das ist, welche Art von Nachrichten SNS - Strings liefert. Keine Objekte. SNS hat keinen Sinn dafür, dass das Attribut Message irgendein Objekt ist. Es könnte alles sein, solange es gültig ist UTF-8, SNS ist es egal.

Um ein Objekt als String zu übergeben, muss es serialisiert werden ... und die innere Serialisierung ist ebenfalls JSON.

So ist Message geschachtelte JSON-in-JSON.

Und so soll es aussehen.

Wenn das äußere Objekt serialisiert wird, müssen die reservierten JSON-Zeichen wie in der Abbildung gezeigt maskiert werden. Nach der ersten Deserialisierung haben Sie genau das, was Ihnen SES gesendet hat - eine JSON-Zeichenfolge.

Sie müssen dann die resultierende Zeichenfolge deserialisieren, um Ihr Objekt zu erhalten.

Ich glaube nicht, dass Sie es falsch machen. Wenn Sie es sind, mache ich es seit Jahren falsch.

Verwandte Themen