Converting DynamoDB JSON to Standard JSON with Java Converting DynamoDB JSON to Standard JSON with Java json json

Converting DynamoDB JSON to Standard JSON with Java


You can use ItemUtils class in aws sdk. Below is sample code using Kotlin:

import com.amazonaws.services.dynamodbv2.document.ItemUtilsimport com.amazonaws.services.dynamodbv2.model.AttributeValuefun main(args: Array<String>) {    val data = HashMap<String,AttributeValue>()    data.put("hello",AttributeValue().withS("world"))    println(data.toString())    println(ItemUtils.toItem(data).toJSON())}

Output:

{hello={S: world,}}{"hello":"world"}


Below is the complete code for converting from Dynamo JSON to 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<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.";    }} 


Following is a simple solution which can be applied to convert any DynamoDB Json to Simple JSON.

//passing the reponse.getItems() public static Object getJson(List<Map<String,AttributeValue>> mapList) {    List<Object> finalJson= new ArrayList();    for(Map<String,AttributeValue> eachEntry : mapList) {        finalJson.add(mapToJson(eachEntry));    }    return finalJson;}//if the map is null then it add the key and value(string) in the finalKeyValueMappublic static Map<String,Object> mapToJson(Map<String,AttributeValue> keyValueMap){    Map<String,Object> finalKeyValueMap = new HashMap();    for(Map.Entry<String, AttributeValue> entry : keyValueMap.entrySet())     {        if(entry.getValue().getM() == null) {            finalKeyValueMap.put(entry.getKey(),entry.getValue().getS());        }        else {            finalKeyValueMap.put(entry.getKey(),mapToJson(entry.getValue().getM()));        }    }    return finalKeyValueMap;}

This will produce your desired Json in the form of List>. Then using the Gson you can convert it into the Json format.

Gson gson = new Gson();String jsonString = gson.toJson(getJson(response.getItems()));