2017-05-30 28 views
0

AWSでラムダ関数を設定していて、JSONをDynamoDB(NoSQL)に挿入したいとします。 JSON(decimal_serializer)のシリアライズと関係があると思いますが、間違っている可能性があります。手伝ってくれてありがとう!AWS Lambda JSONからDynamoDB KeyError JSONをシリアライズ

このデータをシリアライズしながら、私はエラーを次取得:

エラーMSG:

{ 
    "errorMessage": "'male_confidence'", 
    "errorType": "KeyError" 
} 

JSONデータを挿入する:

{ 
    "device_id": "abc876", 
    "recorded_at": "1496136878", 
    "customers": [ 
    { 
     "male_confidence": "0.2", 
     "female_confidence": "0.8" 
    }, 
    { 
     "male_confidence:": "0.1", 
     "female_confidence": "0.9" 
    } 
    ] 
} 

ラムダ関数ハンドラ

import boto3 
import json 

def lambda_handler(event, context): 
    # TODO implement 
    client = boto3.client('dynamodb') 
    for customer in event['customers']: 
     client.put_item(TableName="cv_data_1", Item={'device_id': {"S": event['device_id']}, 'male_confindence': {"N": customer['male_confidence']}, 'female_confidence': {"N": customer['female_confidence']}, "timestamp":{ "N": event['recorded_at']}}) 
    print('Successfully processed %s items.' % str(len(event['customers']))) 

AWS出力ログ・エラー(詳細):

During handling of the above exception, another exception occurred: 
 
09:23:38 
Traceback (most recent call last): 
 
09:23:38 
File "/var/runtime/awslambda/bootstrap.py", line 463, in <module> 
 
09:23:38 
main() 
 
09:23:38 
File "/var/runtime/awslambda/bootstrap.py", line 459, in main 
 
09:23:38 
handle_event_request(request_handler, invokeid, event_body, context_objs, invoked_function_arn) 
 
09:23:38 
File "/var/runtime/awslambda/bootstrap.py", line 240, in handle_event_request 
 
09:23:38 
result = to_json(result) 
 
09:23:38 
File "/var/runtime/awslambda/bootstrap.py", line 215, in to_json 
 
09:23:38 
return json.dumps(obj, default=decimal_serializer) 
 
09:23:38 
File "/var/lang/lib/python3.6/json/__init__.py", line 238, in dumps 
 
09:23:38 
**kw).encode(obj) 
 
09:23:38 
File "/var/lang/lib/python3.6/json/encoder.py", line 199, in encode 
 
09:23:38 
chunks = self.iterencode(o, _one_shot=True) 
 
09:23:38 
File "/var/lang/lib/python3.6/json/encoder.py", line 257, in iterencode 
 
09:23:38 
return _iterencode(o, 0) 
 
09:23:38 
File "/var/runtime/awslambda/bootstrap.py", line 104, in decimal_serializer 
 
09:23:38 
raise TypeError(repr(o) + " is not JSON serializable") 
 
09:23:38 
TypeError: <FrameSummary file /var/task/lambda_function.py, line 8 in lambda_handler> is not JSON serializable 
+0

エラーメッセージから、 'male_confidence'が' customer'のいずれかに欠落しているようです。 (意図しない言い訳)。ラムダハンドラに 'event'を出力して、' event'に含まれるデータを見ることができますか?出力は、クラウドウォッチログに出力されます。 – nightgaunt

+0

'{ 'DEVICE_ID': 'abc876'、 'recorded_at': '1496136878'、'顧客:[{ 'male_confidence': '0.2'、 'female_confidence': '0.8'}、{ 'male_confidence:':「0.1 '、' female_confidence ':' 0.9 '}]} 'のようになりますが、' print(customer) 'をループに出力すると、以下の' dict'を返します。 – zer02

+0

私は 'customer ['male_confidence']'をループ内に表示し、それは私に '0.2'を返します、2番目のループは上記のエラーで壊れます。 – zer02

答えて

1

タイプミス:

"male_confidence:": "0.1", 
    "female_confidence": "0.9" 

"male_confidence:"

+0

THANKS ALOT!私は夢中になりました。 – zer02

1

あなたはmale_confidence:後にタイプミスがあり、ノート余分な:。試してみてください

{ 
    "device_id": "abc876", 
    "recorded_at": "1496136878", 
    "customers": [ 
    { 
     "male_confidence": "0.2", 
     "female_confidence": "0.8" 
    }, 
    { 
     "male_confidence": "0.1", 
     "female_confidence": "0.9" 
    } 
    ] 
} 
関連する問題