【问题标题】:Trouble Deserializing Object Pulled from SQS using GSON使用 GSON 反序列化从 SQS 中提取的对象时遇到问题
【发布时间】:2020-03-29 19:18:37
【问题描述】:

我有一个 lambda 函数,当文件放入 S3 存储桶时接收 S3Event 对象。当 lambda 失败时,它会进入 Amazon SQS 中设置的死信队列。

当我提取这些消息时,这是正文:

{
"Records": [
    {
        "eventVersion": "2.1",
        "eventSource": "aws:s3",
        "awsRegion": "us-east-1",
        "eventTime": "d",
        "eventName": "d:Put",
        "userIdentity": {
            "principalId": ""
        },
        "requestParameters": {
            "sourceIPAddress": "2"
        },
        "responseElements": {
            "x-amz-request-id": "",
            "x-amz-id-2": "g"
        },
        "s3": {
            "s3SchemaVersion": "1.0",
            "configurationId": "",
            "bucket": {
                "name": "",
                "ownerIdentity": {
                    "principalId": ""
                },
                "arn": ""
            },
            "object": {
                "key": "",
                "size": 12502,
                "eTag": "",
                "sequencer": ""
            }
        }
    }
]

}

这看起来很像包含 S3EventNotification 记录列表的 S3Event 对象。我尝试使用以下方法将其反序列化为 S3 事件对象:

S3Event event = new GsonBuilder().serializeNulls().create().fromJson(s3EventString, S3Event.class);

这会产生一个像这样的空对象:

{"records":null}

我注意到在从 SQS 返回的 json 中,Records 中的“R”是大写的。我不确定这是否会有所不同,所以我将其更改为小写“r”,它会引发此错误:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING

我真的不确定这实际上是什么类型的对象。

任何帮助将不胜感激。

【问题讨论】:

    标签: events amazon-s3 gson amazon-sqs typetoken


    【解决方案1】:

    奇怪。使用 Jackson 它可以完美运行,所以我现在将使用它..

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.amazonaws.services.sqs.model.Message;
    
    private S3Event extractS3Event(Message message){
         ObjectMapper objectMapper = new ObjectMapper();
         return objectMapper.readValue(message.getBody(), S3Event.class)
    }
    
    //Then to get the S3 Details
    
    S3Event event = extractS3Event(message);
    S3Entity entity = event.getRecords().get(0).getS3();
    String bucketName = entity.getBucket().getName();
    String s3Key = entity.getObject().getKey();
    
    【解决方案2】:

    回复:BEGIN_OBJECT but was STRING.

    这是因为 AWS 使用 JodaTime 作为 EventTime。您可以通过从 JSON 文本中删除该字段来避免此问题(假设您不需要它)

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多