将嵌套的json解析为原始字符串

MrM:

我正在编写接收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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章