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

标签 java json jackson

我正在编写一个接收 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。我尝试将其解析为原始值,如 How can I include raw JSON in an object using Jackson?但它一直提示它在需要逗号分隔对象的地方找到了一个 u 。

由于我无法将原始 json 发布到 SQS 并且必须对其进行字符串化,因此如何将其解析为可以获取 json 消息的对象?

我尝试创建一个 pojo 并尝试上面的链接,但 Jackson 一直提示消息变量。

--- 使用代码更新 ---

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;
}
}

这就是我现在所拥有的。我尝试将消息更改为字符串,但这没有改变任何内容。

最佳答案

基本问题是 "Message":"{"uuid":"someUuid"}" 不是有效的 json,因此 Jackson 无法解析这部分。从 json 的角度来看,"Message" 的值为 "{",因此以下 uuid 会导致错误。

要处理这个问题,您需要正确转义嵌套的 json,使其看起来像 Jackson 的任何其他字符串,即您想要得到如下内容:

"Message":"{\"uuid\":\"someUuid\"}"

这里 "Message" 的值为 "{\"uuid\":\"someUuid\"}" 因此 Jackson 可以获取该字符串并处理它进一步(将其放入字符串或取消转义并解析)。

这意味着您不应该尝试在解析端解决问题,而应在生成端解决问题,即创建 HandleServiceRequest(...) 的请求正文的位置。

关于java - 将嵌套 json 解析为原始字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56700869/

相关文章:

java - 如何为不同的变量创建多个控制台输入?

java - 将扫描器与字符串进行比较

ruby - 将 Ruby 字符串编码为 JSON 字符串

c - JSON 格式字符串上的 strtok 分隔符问题

python - 尝试用python读取json文件

java - 忽略反序列化中的计算字段

java - 下载 JavaHelp 库

java - jackson View 中的 DEFAULT_VIEW_INCLUSION 设置有问题

java - 在独立 JavaSE 应用程序中与 JAXB 和 Jackson 进行 JSON 绑定(bind)

java - 当我添加一个项目时,tableview 是空的