如何从DynamoDB流新的图像中获取纯Json字符串?

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

public class LambdaFunctionHandler implements RequestHandler { @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 currentRecord = record.getDynamodb().getNewImage(); //how to get the pure json string of the new image //.............................................. } return "Successfully processed " + input.getRecords().size() + " records."; } 

}

以下是从Dynamo JSON转换为Standard 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 { private static final String INSERT = "INSERT"; private static final String MODIFY = "MODIFY"; public String handleRequest(DynamodbEvent ddbEvent, Context context) { List listOfItem = new ArrayList<>(); List> listOfMaps = null; for (DynamodbStreamRecord record : ddbEvent.getRecords()) { if (INSERT.equals(record.getEventName()) || MODIFY.equals(record.getEventName())) { listOfMaps = new ArrayList>(); 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."; } } 

找到一种干净利落的方式。 使用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 ); 

你有没有办法做到这一点。 一种粗略的方法是创建自己的解析器,但即使我们不想采用这种方法

只是总结一下Himanshu Parmar的答案:

 Map newImage = record.getDynamodb().getNewImage(); List> listOfMaps = new ArrayList>(); listOfMaps.add(newImage); List itemList = InternalUtils.toItemList(listOfMaps); for (Item item : itemList) { String json = item.toJSON(); } 

在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 model = JsonConvert.DeserializeObject(jsonResult);

这个库完成这项工作: dynamoDb-marshaler

 var unmarshalJson = require('dynamodb-marshaler').unmarshalJson; console.log('jsonItem Record: %j', unmarshalJson(record.dynamodb.NewImage)); 
Interesting Posts