2017-12-09 5 views
0

Der Versuch, ein Labor für die Einrichtung eines mobilen Spiels abzuschließen. Aber die Lambda-Funktion wirft den folgenden Fehler:JSON-Fehler erwartete Zeichenfolge oder Puffer: TypeError Lambda-Funktion fehlgeschlagen

expected string or buffer: TypeError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 34, in lambda_handler json_data = json.loads(msg)

Von dem, was ich verstehe es eine Zeichenkette erwartet, aber die Variable msg ist ein Wörterbuch, das auch Liste enthält. Kann mir jemand erklären, wie ich das schaffen kann? Sollte es stattdessen eine json.dump sein? Neu bei Python und Kodierung also bitte verzeihen Sie, wenn ich die Frage nicht richtig richte. Code ist unten. Vielen Dank im Voraus

def lambda_handler(event, context): 
global client 
print(event) 
# check the receiver's queue url 
if client == None: 
    client = boto3.resource('sqs') 
records = event['Records'][0] 
sns_data = records['Sns'] 
msg = sns_data['Message'] 
print(msg) 
json_data = json.loads(msg) 
type_of_msg = json_data['type'] 
sender = json_data['sender'] 
receiver = json_data['receiver'] 
amount = json_data['amount'] 
# queue_name = get_queue_name_by_account_id(receiver) 
queue_name = USER_POOL_ID + "_" + receiver 
# enqueue the message 
queue = client.get_queue_by_name(QueueName=queue_name) 
msg = { 
    "type": type_of_msg, 
    "amount": amount 
} 
res = queue.send_message(MessageBody=json.dumps(msg)) 
print(res) 
return json_data['receiver'] 
+0

Bearbeiten Sie den obigen Beispielcode, um den richtigen Einzug zu erhalten. – Gary02127

+0

Er sagte nur, das ist ein Wörterbuch. –

+1

Sie sollten 'json.dumps' verwenden. –

Antwort

0

json.loads einen String oder Puffer benötigt, keine json.

msg ist bereits ein json, brauchen nicht json.loads zu tun.

unten ist ein funktionierendes Beispiel.

import boto3 
import json 

def lambda_handler(event, context): 
    client = None 
    USER_POOL_ID = 'xxxxx' 
    print(event) 
    # check the receiver's queue url 
    if client == None: 
     client = boto3.resource('sqs') 
    records = event['Records'][0] 
    sns_data = records['Sns'] 
    msg = sns_data['Message'] 
    print(msg) 
    json_data = msg 
    type_of_msg = json_data['type'] 
    sender = json_data['sender'] 
    receiver = json_data['receiver'] 
    amount = json_data['amount'] 
    # queue_name = get_queue_name_by_account_id(receiver) 
    queue_name = USER_POOL_ID + "_" + receiver 
    #enqueue the message 
    queue = client.get_queue_by_name(QueueName=queue_name) 
    msg = { 
     "type": type_of_msg, 
     "amount": amount 
    } 
    res = queue.send_message(MessageBody=json.dumps(msg)) 
    print(res) 
    return json_data['receiver'] 

Mit Beispiel Test-Event für Lambda:

{ 
    "Records": [ 
     {"Sns": {"Message": {"type": "a","sender": "b","receiver": "c","amount": "d"}}} 
    ] 
} 

hoffe, das hilft!

+0

Danke ich konnte es funktionieren !! –

Verwandte Themen