在Zapier中使用此代码时,为什么会出现Runtime.MarshalError?

时间:2019-01-28 17:28:01

标签: python zapier

以下代码给了我

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'

2 个答案:

答案 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']))}