【问题标题】:How to deserialize DynamoDB Map type in Lambda handler如何在 Lambda 处理程序中反序列化 DynamoDB Map 类型
【发布时间】:2017-08-07 12:20:34
【问题描述】:

我有一个简单的 POJO:

public class MyClass {
    public String id;
    public String name;
}

我想将其序列化为 JSON 格式,该格式与适用于 DynamoDB 事件的 AWS Lambda 处理程序为 DynamoDB 类型 Map 的嵌入式文档获取的格式相同:

M: { 
    id= { S: "abc123", },
    name= { S: "whatever", },
}

更重要的是,我想从我的 Lambda 函数为每次插入接收到的 JSON 中反序列化它。我能找到的唯一例子是非常简单的例子。它们都不包括在 Lambda 处理程序内的事件中处理 DynamoDB 映射。

我想知道是否必须手动编写序列化程序,或者 SDK 中是否有我尚未找到的东西。

【问题讨论】:

    标签: java amazon-web-services amazon-dynamodb aws-lambda aws-sdk


    【解决方案1】:

    您可以将 POJO 映射到 com.amazonaws.services.dynamodbv2.model.AttributeValue 的实例,然后使用 GSON 对其进行序列化/反序列化。

    这是get started with Gson的方法。

    以下是如何使用 Gson 操作 AttributeValue 的示例。

    AttributeValue av1 = new AttributeValue("abc123");
    AttributeValue av2 = new AttributeValue("whatever");
    AttributeValue avM = new AttributeValue();
    Map<String, AttributeValue> m = new HashMap<String, AttributeValue>();
    m.put("id", av1);
    m.put("name", av2);
    avM.setM(m);
    System.out.println(new Gson().toJson(avM));
    // {"m":{"name":{"s":"whatever"},"id":{"s":"abc123"}}}
    
    Map<String, Object> simpleMap = new HashMap<String, Object>();
    simpleMap.put("id", "abc123");
    simpleMap.put("name", "whatever");
    AttributeValue avM2 = new AttributeValue().withM(InternalUtils.fromSimpleMap(simpleMap));
    System.out.println(new Gson().toJson(avM2));
    // {"m":{"name":{"s":"whatever"},"id":{"s":"abc123"}}}
    
    String jsonStr = new Gson().toJson(avM2);
    AttributeValue avM3 = new Gson().fromJson(jsonStr, AttributeValue.class);
    System.out.println(avM3.getM().get("id").getS());
    // abc123
    System.out.println(avM3.getM().get("name").getS());
    // whatever
    

    如果您正在使用 Java 开始使用 Lambda 和 DynamoDB,我建议您查看Secure Pet Store

    【讨论】:

    • 您能举个例子吗?我想一个链接就可以了。
    • 如果不想依赖 Gson,也可以使用包含的 Jackson 类:ObjectWriter writer = Jackson.getObjectMapper().setSerializationInclusion(Include.NON_NULL).writer();
    • 谢谢!我希望有一种不那么繁琐的方法,但现在就可以了。
    猜你喜欢
    • 2019-11-20
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2019-11-13
    • 2021-09-29
    相关资源
    最近更新 更多