BBH
-Biz Branding Hub-
投稿日 : 
2019/12/09
更新日 : 
2019/12/09

【DynamoDB】取得したJSONからデータタイプを削除するユーティリティ

DynamoDBではデータをJSON形式で取得したときに、単純なキーバリュー形式ではなく、間にデータ型が挟まっています。
具体的には以下のような感じになっています。

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'})}

データタイプが削除されているのがわかりますね。
これで、単純にキーを指定するだけで値を取得することができます。

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend