web-dev-qa-db-ja.com

DynamoDBストリームの新しいイメージから純粋なJson文字列を取得するにはどうすればよいですか?

ストリーミングが有効になっているDynamodbテーブルがあります。また、AWSLambda関数を呼び出すこのテーブルのトリガーを作成しました。このラムダ関数内で、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.";
}

}

12
Asanga Dewaguru

以下は、DynamoJSONから標準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.";
    }
} 
6
Himanshu Parmar

C#では、DynamoDBドキュメントクラスを使用して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);

3
Guru

それをきれいに行う方法を見つけました。 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 );
2
shailender arya

ひまんしゅパルマーの答えをまとめるだけです。

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();
}
2
lost in binary

これを行う方法を見つけましたか。大まかな方法​​の1つは、独自のパーサーを作成することですが、そのアプローチを採用したくありません。

0
shailender arya