16

我有一个启用了流的 Dynamodb 表。我还为这个表创建了一个触发器,它调用了一个 AWS Lambda 函数。在这个 lambda 函数中,我尝试从 Dynamodb 流中读取新图像(修改后的 Dynamodb 项)并尝试从中获取纯 json 字符串。我的问题是如何获取通过流发送的 DynamoDB 项目的纯 json 字符串?我正在使用下面给出的代码片段来获取新图像,但我不知道如何从中获取 json 字符串。感谢你的帮助。

public class LambdaFunctionHandler implements RequestHandler<DynamodbEvent, Object> {

@Override
public Object handleRequest(DynamodbEvent input, Context context) {
    context.getLogger().log("Input: " + input);

    for (DynamodbStreamRecord record : input.getRecords()){

        context.getLogger().log(record.getEventID());
        context.getLogger().log(record.getEventName());
        context.getLogger().log(record.getDynamodb().toString());
        Map<String,AttributeValue> currentRecord = record.getDynamodb().getNewImage();

        //how to get the pure json string of the new image
        //..............................................
     }
     return "Successfully processed " + input.getRecords().size() + " records.";
}

}

4

6 回答 6

9

以下是从 Dynamo JSON 转换为标准 JSON 的完整代码:

import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.internal.InternalUtils;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent.DynamodbStreamRecord;
import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Main Lambda class to receive event stream, parse it to Survey
 * and process them.
 */
public class SurveyEventProcessor implements
        RequestHandler<DynamodbEvent, String> {

    private static final String INSERT = "INSERT";

    private static final String MODIFY = "MODIFY";

    public String handleRequest(DynamodbEvent ddbEvent, Context context) {

        List<Item> listOfItem = new ArrayList<>();
        List<Map<String, AttributeValue>> listOfMaps = null;
        for (DynamodbStreamRecord record : ddbEvent.getRecords()) {

            if (INSERT.equals(record.getEventName()) || MODIFY.equals(record.getEventName())) {
                listOfMaps = new ArrayList<Map<String, AttributeValue>>();
                listOfMaps.add(record.getDynamodb().getNewImage());
                listOfItem = InternalUtils.toItemList(listOfMaps);
            }

            System.out.println(listOfItem);
            try {
               // String json = new ObjectMapper().writeValueAsString(listOfItem.get(0));
                Gson gson = new Gson();
                Item item = listOfItem.get(0);

                String json = gson.toJson(item.asMap());
                System.out.println("JSON is ");
                System.out.println(json);
            }catch (Exception e){
                e.printStackTrace();
            }
        }


        return "Successfully processed " + ddbEvent.getRecords().size() + " records.";
    }
} 
于 2017-05-11T14:54:54.273 回答
6

在 c# 中,您可以使用 DynamoDB Document 类将 newImage 转换为纯 json

使用 Amazon.DynamoDBv2.DocumentModel;

var streamRecord = dynamoEvent.Records.First();

var jsonResult=Document.FromAttributeMap(streamRecord.Dynamodb.NewImage).ToJson();


如果您想进一步将 json 转换为对象,您可以使用 Newtonsoft

使用 Newtonsoft.Json;

TModel 模型 = JsonConvert.DeserializeObject(jsonResult);

于 2018-08-22T20:56:48.487 回答
3

简单总结一下Himanshu Parmar的回答:

Map<String, AttributeValue> newImage = record.getDynamodb().getNewImage();
List<Map<String, AttributeValue>> listOfMaps = new ArrayList<Map<String, AttributeValue>>();
listOfMaps.add(newImage);
List<Item> itemList = ItemUtils.toItemList(listOfMaps);
for (Item item : itemList) {
    String json = item.toJSON();
}
于 2017-06-01T13:06:54.830 回答
2

找到了一种干净利落的方法。使用 aws-java-sdk-dynamodb-1.11.15.jar 中的 InternalUtils

com.amazonaws.services.dynamodbv2.model.Record streamRecord = ((RecordAdapter) record).getInternalObject();
            // get order ready //
            OrderFinal order = Utils.mapO2Object(
                    InternalUtils.toSimpleMapValue(streamRecord.getDynamodb().getNewImage().get("document").getM()), 
                    OrderFinal.class );
于 2016-08-08T06:11:39.387 回答
0

对于那些坚持使用 Map<String, ?> 对象是普通 Map 而不是 Attributes 值的人,您可以执行以下操作:

Map<String, AttributeValue> dynamoDbAttributes = 
    objectMapper.convertValue(dynamoDbMap, new TypeReference<Map<String, AttributeValue>>() {});

然后将这个 DynamoDB Map 转换成一个普通的 Map(相当于原来推入 DynamoDb 的 json):

asMap = InternalUtils.toSimpleMapValue(dynamoDbAttributes);
于 2021-07-31T18:10:26.120 回答
-2

这个库做的工作:dynamoDb-marshaler

var unmarshalJson = require('dynamodb-marshaler').unmarshalJson;

console.log('jsonItem Record: %j', unmarshalJson(record.dynamodb.NewImage));
于 2017-02-22T20:32:54.053 回答