DynamoDBではデータをJSON形式で取得したときに、単純なキーバリュー形式ではなく、間にデータ型が挟まっています。
具体的には以下のような感じになっています。
{ 'Data1': {'S': 'Data1_Val'}, 'Data2': {'S': 'Data2_Val'}, 'Data3': {'S': 'Data3_Val'} }
この形式だと、キーでデータを取得しようとしたときに、
・キー指定してデータを取得
・上記データからデータ型をキーとして値を取得
という二段階を踏まないといけません。
また、データ型がわからないと値を取得できないというデメリットもあります。
そうした面倒を省くために、JSONからデータタイプを排除するユーティリティを作ってみました。
import ast # ===== 変換ユーティリティ ===== def convert_data_exclude_data_type(record): res = {} for r in record: # str -> dictionaryに変換 if (r == 'dictionary'): otherDataVal = record['dictionary']['S'] res['dictionary'] = ast.literal_eval(otherDataVal) # データタイプを除去する else: key = r # 例)'LogGroup' value = list(record[key].keys())[0] # 例)'S' value_value = record[key][value] # 例)'/aws/lambda/Monitering_test_lambda' res[key] = value_value return res # ===== メイン処理 ===== print('===== 変換前データ =====') test_data = { 'Data1': {'S': 'Data1_Val'}, 'Data2': {'S': 'Data2_Val'}, 'Data3': {'S': 'Data3_Val'}, 'dictionary': {'S': r"{'ChildData1': '1'}, {'ChildData2': '1'}"}, } print(test_data) print('===== 変換後データ =====') test_data_convd = convert_data_exclude_data_type(test_data) print(test_data_convd)
カラムに直接Dictionary形式のstringが格納されている場合も想定して、convert_data_exclude_data_typeにそれ用の分岐も入っています。
不要な場合は削除してください。
これを実施すると以下のようになります。
===== 変換前データ ===== {'Data1': {'S': 'Data1_Val'}, 'Data2': {'S': 'Data2_Val'}, 'Data3': {'S': 'Data3_Val'}, 'dictionary': {'S': "{'ChildData1': '1'}, {'ChildData2': '1'}"}} ===== 変換後データ ===== {'Data1': 'Data1_Val', 'Data2': 'Data2_Val', 'Data3': 'Data3_Val', 'dictionary': ({'ChildData1': '1'}, {'ChildData2': '1'})}
データタイプが削除されているのがわかりますね。
これで、単純にキーを指定するだけで値を取得することができます。