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()));