実現したいこと
AWSのLambdaにてS3からJSONファイルを取得してDynamoDBに投入する
プログラムを作成しようとしております。その際にS3から取得したJSONを
DynamoDBにputできる形式に変換するところでつまずいております。
理想としては以下の様にリストの中に辞書が入れ子になっている形式が理想なのです。
[{"key1":"val1","key2":"val2"},{"key1":"val3","key2":"val4"},{"key1":"val5","key2":"val6"}]
現在はリストの中に文字列として入ってしまっている状態です。(以下の様な状態です)
["{"key1":"val1","key2":"val2"},{"key1":"val3","key2":"val4"},{"key1":"val5","key2":"val6"}"]
何とか理想通りの出力とするためにはどの様に処理すればいいでしょうか。
該当のソースコード
python
1import logging 2import boto3 3import json 4import datetime 5 6LOGGER = logging.getLogger() 7LOGGER.setLevel(logging.INFO) 8dynamodb = boto3.resource('dynamodb') 9s3 = boto3.client('s3') 10 11# DynamoDBに書込み(ここは動きます) 12def put_item(writeitems,writetable): 13 try: 14 table = dynamodb.Table(writetable) 15 with table.batch_writer() as batch: 16 for i in range(len(writeitems)): 17 batch.put_item( 18 Item=writeitems[i] 19 ) 20 LOGGER.info("Completed registration") 21 return "end" 22 except Exception as e: 23 LOGGER.error(e) 24 raise e 25# S3で読込んだJSONを辞書型配列に変換 26def translateJson(res): 27 try: 28 td = json.dumps(res.decode('utf-8-sig')) 29 tr = str.maketrans({'[': '', ']': ''}) 30 s = td.translate(tr) 31 d = json.loads(s) 32 values = [] 33 values.append(d) 34 35# ここのコメント相当の箇所をS3から読み込んで処理させたいというものです。 36# この書式であれば辞書型なのでうまく処理はできました。 37# for i in range(50): 38# values.append({ 39# 'i-code': '111-0002', 40# 's-key': 'blog' + str(i), 41# 'VAL1': i, 42# }) 43 44 return values 45 except Exception as e: 46 LOGGER.error(e) 47 raise e 48#### 49def lambda_handler(event, context): 50 try: 51 table_name = "item-content" 52 bucket_name = 'dynamodb-importdata' 53 file_name = 'item-content.json' 54 cd = datetime.datetime.now() 55 response = s3.get_object(Bucket=bucket_name, Key=file_name) 56 tabledata = response['Body'].read() 57 objItems = translateJson(tabledata) 58 stat = put_item(objItems,table_name) 59 LOGGER.info("Completed registration") 60 return objItems 61 except Exception as e: 62 LOGGER.error(e) 63 raise e
その他補足
res.decode('utf-8-sig')の時点での文字列です。
"\"[{\\"item-code\\":\\"1-0001\\",\\"search-key\\":\\"1010\\",\\"VAL1\\":\\"2000\\",\\"VAL2\\":\\"\u30c6\u30b9\u30c8\u9805\u76ee1\\",\\"VAL3\\":\\"\u8aac\u660e1\\",\\"VAL4\\":\\"\u9805\u76ee1\\",\\"VAL5\\":\\"\u67a01\\"},{\\"item-code\\":\\"1-0002\\",\\"search-key\\":\\"1010\\",\\"VAL1\\":\\"2500\\",\\"VAL2\\":\\"\u30c6\u30b9\u30c8\u9805\u76ee2\\",\\"VAL3\\":\\"\u8aac\u660e2\\",\\"VAL4\\":\\"\u9805\u76ee2\\",\\"VAL5\\":\\"\u67a02\\"},{\\"item-code\\":\\"1-0003\\",\\"search-key\\":\\"1010\\",\\"VAL1\\":\\"3000\\",\\"VAL5\\":\\"\u67a03\\"},{\\"item-code\\":\\"7-0011\\",\\"search-key\\":\\"1111\\",\\"VAL1\\":\\"49680\\",\\"VAL2\\":\\"\u30c6\u30b9\u30c8\u9805\u76ee64\\",\\"VAL3\\":\\"\u8aac\u660e64\\",\\"VAL4\\":\\"\u9805\u76ee64\\",\\"VAL5\\":\\"\u67a064\\"},{\\"item-code\\":\\"7-0012\\",\\"search-key\\":\\"1111\\",\\"VAL1\\":\\"53320\\",\\"VAL3\\":\\"\u8aac\u660e65\\",\\"VAL4\\":\\"\u9805\u76ee65\\",\\"VAL5\\":\\"\u67a065\\"},{\\"item-code\\":\\"7-0013\\",\\"search-key\\":\\"1111\\",\\"VAL1\\":\\"56960\\",\\"VAL5\\":\\"\u67a066\\"},{\\"item-code\\":\\"7-0014\\",\\"search-key\\":\\"1010\\",\\"VAL1\\":\\"60600\\",\\"VAL5\\":\\"\u67a067\\"},{\\"item-code\\":\\"8-0001\\",\\"search-key\\":\\"1110\\",\\"VAL1\\":\\"64240\\",\\"VAL5\\":\\"\u67a068\\"},{\\"item-code\\":\\"8-0002\\",\\"search-key\\":\\"1110\\",\\"VAL1\\":\\"67880\\",\\"VAL5\\":\\"\u67a069\\"},{\\"item-code\\":\\"8-0003\\",\\"search-key\\":\\"1011\\",\\"VAL1\\":\\"71520\\",\\"VAL3\\":\\"\u8aac\u660e70\\",\\"VAL4\\":\\"\u9805\u76ee70\\",\\"VAL5\\":\\"\u67a070\\"}]\""
res.decode('utf-8-sig')の時点ではどんな文字列になっていますか? translateJsonの返り値を質問文に記載されている希望のフォーマットに変換したいという理解で良いでしょうか
回答1件
あなたの回答
tips
プレビュー