我正在编写接收SQS队列对象的Lambda函数。SQS将json对象作为字符串值发送到SQS。
当我在Lambda中收到请求时,AWS将其包装到新的JSON中,并且由于json是字符串值,因此它变为无效的json。
(示例)json看起来像:
{"uuid ":"someuuid"}
我们将此作为字符串发送到SQS。然后,AWS将其包装为以下内容:
{
"Records": [
{
"messageId": "somemesasgeid",
"receiptHandle": "MessageReceiptHandle",
"body": {
"Message":"{"uuid":"someUuid"}"
},
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "sometimestamp",
"SenderId": "someid",
"ApproximateFirstReceiveTimestamp": "sometimestamp"
},
"messageAttributes": {},
"md5OfBody": "somebody",
"eventSource": "aws:sqs",
"eventSourceARN": "someARN",
"awsRegion": "eu-west-1"
}
]
}
现在body.Message无效的Json。我尝试将其解析为原始值,例如如何使用Jackson将原始JSON包含在对象中?但它一直抱怨它在非盟期望的地方找到了一个逗号。
由于我无法将原始json发布到SQS并必须对其进行字符串化,因此我该如何将其解析为可以获取json消息的对象?
我尝试创建一个pojo并尝试了上面的链接,但是杰克逊一直抱怨message变量。
-更新代码-
private Response HandleServiceRequest(Map<String, Object> input) {
List<String> records = (List<String>) input.get("Records");
for(String r : records) {
SqsMessage m = objectMapper.readValue(r, SqsMessage.class);
}
}
public class SqsMessage {
// all other values
SqsBody body;
// getters/setters
}
public class SqsBody {
// all other values
@JsonProperty("Message")
private Object message;
// getters/setters
@JsonRawValue
public String getMessage() {
message == null ? null : message.toString();
}
public void setMessage(Object message){
this.message = message;
}
}
这就是我现在所拥有的。我尝试将消息更改为String,但没有任何改变。
基本问题是"Message":"{"uuid":"someUuid"}"
无效的json,因此Jackson无法解析此部分。从json的角度来看,"Message"
is 的值,"{"
因此以下uuid
导致错误。
要处理此问题,您需要适当地转义嵌套的json,以使其看起来像Jackson的任何其他字符串一样,即,您想要获得以下内容:
"Message":"{\"uuid\":\"someUuid\"}"
这里的"Message"
is 值,"{\"uuid\":\"someUuid\"}"
因此Jackson可以使用该字符串并进一步处理它(将其放入字符串或取消转义和解析)。
这意味着您不应该尝试在解析方面解决问题,而应该在生成方面,即HandleServiceRequest(...)
创建请求主体的地方。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句