当前位置: 首页 > 知识库问答 >
问题:

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

冯奇思
2023-03-14

我正在编写一个接收SQS队列对象的Lambda函数。SQS将json对象作为字符串值发送给SQS。

当我在Lambda中接收到请求时,AWS已经将其包装成一个新的JSON,由于JSON是一个字符串值,因此它将成为无效的JSON。

{"uuid ":"someuuid"} 
{
  "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?但它总是抱怨,它在期待逗号分隔对象的地方找到了一个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;
}
}

共有1个答案

唐增
2023-03-14

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

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

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

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

这意味着您不应该尝试在解析端解决这个问题,而应该在生成端解决这个问题,即在创建handleserviceRequest(...)的请求体的地方。

 类似资料:
  • 我以前使用过对嵌套类的改装,但我目前尝试使用的api有这样一种结构: 请求正文: 和一个类似的响应机构。 请注意,bigNestedClass是一个字符串。 我为请求和响应创建了不同的pojo类。但是,创建嵌套的BigNestedClass会使该字段如预期的那样填充为JSON对象,而不是JSON字符串。我在解析响应时也遇到了同样的问题。 我的问题:有没有一种改造方法可以将嵌套类编码、解析为字符串?

  • 服务器js 使用body parser中间件、把手和express 路线 客户 当记录我得到一个JSON字符串 {'{"满意":"文本1","改进":"文本2","评级":0.7}': '' } 我试着把这个字符串解析成一个对象。当我这样做时,我会收到这个错误消息 那么如何将字符串解析为对象呢? 通常我会执行。

  • 我已经试过各种方法来解决这个问题了。但没有成功。 我有几节这样的课 在这种情况下,T可以是任何对象,并且应该可以在运行时解析。 Jackson真的无法将json反序列化为泛型类型吗?

  • 问题内容: 我正在将我的第一个应用程序构建在骨干网中,我想知道哪种方法是解析具有多个级别的json的最佳模式。这是一个简单的json小示例: 要打印它,我正在使用collection并在主干中查看,如下所示:COLLECTION: 这就是称为视图的两个视图,因为我想要的每个酒店都有不同的视图: 我的模板是: 但是不打印名称,我也尝试过: 但是我无法打印值名称,该怎么做?谢谢 问题答案: 首先,JS

  • 我有映射: 和一些文件: 等等。 我尝试进行查询: 未找到任何结果。如果我尝试将同一查询按字段与其他类型(不是字符串,也没有原始子字段)一起使用,它会起作用。我应该如何为这种情况编写查询?谢谢 P、 美国字段“FieldA”具有子字段raw,因为我需要同时分析和不分析此字段

  • 你知道这是怎么回事吗?