以下代码给了我
Runtime.MarshalError:无法封送响应:{'Yes'}不可序列化
from calendar import monthrange
def time_remaining_less_than_fourteen(year, month, day):
a_year = int(input['year'])
b_month = int(input['month'])
c_day = int(input['day'])
days_in_month = monthrange(int(a_year), int(b_month))[1]
time_remaining = ""
if (days_in_month - c_day) < 14:
time_remaining = "No"
return time_remaining
else:
time_remaining = "Yes"
return time_remaining
output = {time_remaining_less_than_fourteen((input['year']), (input['month']), (input['day']))}
#print(output)
当我删除{...}时,它会抛出:'unicode'对象没有属性'copy'
答案 0 :(得分:13)
当我使用Kinesis Firehose的Lambda转换蓝图kinesis-firehose-process-record-python
时遇到了这个问题,这导致了我的到来。因此,我将向所有在lambda问题上也发现此问题的人提供解决方案。
蓝图是:
from __future__ import print_function
import base64
print('Loading function')
def lambda_handler(event, context):
output = []
for record in event['records']:
print(record['recordId'])
payload = base64.b64decode(record['data'])
# Do custom processing on the payload here
output_record = {
'recordId': record['recordId'],
'result': 'Ok',
'data': base64.b64encode(payload)
}
output.append(output_record)
print('Successfully processed {} records.'.format(len(event['records'])))
return {'records': output}
要注意的是,AWS提供的适用于python的Firehose lambda蓝图适用于Python 2.7,并且不适用于Python3。原因是在Python 3中,字符串和字节数组不同。
使其与由Python 3.x运行时提供支持的lambda一起使用的关键更改是:
更改
'data': base64.b64encode(payload)
进入
'data': base64.b64encode(payload).decode("utf-8")
否则,由于无法使用从base64.b64encode
返回的字节数组来序列化JSON,lambda发生了错误。
答案 1 :(得分:2)
Zapier Platform团队的David在这里。
每the docs:
output
:将是此代码的“返回值”的字典或词典列表。如果愿意,您可以明确地早日返回。 这必须是JSON可序列化的!
在您的情况下,output
是一个集合:
>>> output = {'Yes'}
>>> type(output)
<class 'set'>
>>> json.dumps(output)
Object of type set is not JSON serializable
要可序列化,您需要一个dict(包含键和值)。更改最后一行以包含密钥,它将按预期工作:
# \ here /
output = {'result': time_remaining_less_than_fourteen((input['year']), (input['month']), (input['day']))}