Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将嵌套json解析为原始字符串_Java_Json_Jackson - Fatal编程技术网

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

Java 将嵌套json解析为原始字符串,java,json,jackson,Java,Json,Jackson,我正在编写一个接收SQS队列对象的Lambda函数。SQS将json对象作为字符串值发送给SQS 当我在Lambda中收到请求时,AWS将其包装成一个新的JSON,因为JSON是一个字符串值,所以它变成无效的JSON (示例) json看起来像: {"uuid ":"someuuid"} 我们将其作为字符串发送给SQS。 AWS然后将其包装成如下内容: { "Records": [ { "messageId": "somemesasgeid", "rece

我正在编写一个接收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。我试着将它解析为一个原始值,比如,但它一直抱怨它在需要逗号分隔对象的地方找到了一个u

既然我不能将原始json发布到SQS,并且必须对其进行字符串化,那么如何将其解析到一个可以获取json消息的对象中呢

我尝试创建一个pojo并尝试上面的链接,但是jackson一直在抱怨消息变量

---用代码更新---


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

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

要处理这个问题,您需要正确地转义嵌套的json,以便它看起来像Jackson使用的任何其他字符串,也就是说,您希望得到如下内容:

"Message":"{\"uuid\":\"someUuid\"}"
这里,
“Message”
的值是
“{\“uuid\”:“someUuid\”}”
,因此Jackson可以获取该字符串并进一步处理它(将其放入字符串或unescape并解析)


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

您可以尝试将嵌套的json作为字符串而不是json或pojo来处理吗?这样它应该被转义并生成类似
“消息”的结果:“{\'uuid\”:\'someUuid\“}”
我试过了。String甚至Object。Jackson仍将尝试解析它。不过,我可以尝试在发送给SQS之前转义json。尝试一下。Jackson不应该尝试解析字符串值,除非你告诉它
“Message”
是另一回事。你能提供更多的信息吗,例如a?@Thomas这是我现在拥有的。我尝试将消息更改为字符串,但这对我没有任何影响。你已经发布了你如何试图解析json,但我得到的是如何生成它?
“消息”:“{”uuid:“someUuid”}”
不是有效的json,因此Jackson在任何情况下解析都会遇到问题。您需要在生成时对嵌套的json进行转义,也就是说,将其转换为我在第一条评论中建议的形式-只有正确转义字符串内容,Jackson才能读取整个字符串。
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\"}"