How to get a clean Json string from DynamoDB stream of a new image?

I have a Dynamodb table with streaming enabled. I also created a trigger for this table that calls the AWS Lambda function. Inside this lambda function, I am trying to read a new image (Dynamodb element after modification) from the Dynamodb stream and try to extract a clean json string from it. My question is: how can I get a clean json string of a DynamoDB element that was sent on stream? I use the code snippet below to get a new image, but I don't know how to extract the json string from it. Appreciate your help.

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."; } 

}

+9
source share
6 answers

The following is the complete code for converting from Dynamo JSON to the JSON standard:

 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."; } } 
+4
source

Found a way to do it cleanly. Using InternalUtils from aws-java-sdk-dynamodb-1.11.15.jar

 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 ); 
+2
source

In C #, you can convert newImage to pure JSON using the DynamoDB document class

using Amazon.DynamoDBv2.DocumentModel;

var streamRecord = DynamoEvent.Records.First ();

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


and if you want to go further to convert JSON to an object, you can use Newtonsoft

using Newtonsoft.Json;

Model TModel = JsonConvert.DeserializeObject (jsonResult);

+2
source

Just summing up the answer to Himansh Parmara:

 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(); } 
+1
source

You figured out how to do this. One tough way is to create your own parser, but even we don’t want to go with this approach.

0
source

This library does the job: dynamoDb-marshaler

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

All Articles