如何修复Python中ExternalUnifiedEvent不可JSON序列化的TypeError
报错根因
你的代码一共存在4个问题,共同导致了两类序列化相关报错:
- 语法错误:
get_data()函数内构造字典时,键值对之间缺失逗号分隔;同时遍历的变量名拼写错误,把api_response写成了api_reponse,会导致函数运行逻辑异常,无法返回预期结构。 - 自定义对象无法序列化:
client_api.get()返回的是SDK封装的ExternalUnifiedEvent类实例列表,你构造返回字典时,直接把i.properties(同样是SDK自定义类型的实例,不是Python原生字典)塞入了返回结构,标准库json不支持直接序列化自定义类实例,因此抛出Object of type ExternalUnifiedEvent is not JSON serializable错误。 - 请求传参方式错误:去掉
json.dumps()直接给requests.post的data参数传嵌套自定义对象的结构时,requests会默认尝试按表单格式解析参数,要求传入值为可迭代的键值对结构,嵌套的自定义对象无法被解包,因此抛出cannot unpack non-iterable ExternalUnifiedEvent object错误。 - 字段名不匹配:你构造字典时用的是下划线命名的
event_id、event_type,和你预期输出的驼峰命名eventId、eventType不一致,就算序列化成功也不符合webhook的字段要求。
修复方案
按以下步骤调整即可解决问题:
- 修正所有语法错误:补全字典键值对之间的逗号,修正拼写错误的变量名,异常分支返回空列表避免后续请求拿到
None触发额外报错。 - 把所有自定义类实例转换为Python原生可序列化类型:针对
i.properties这类自定义对象,优先使用SDK自带的字典转换方法(常见的如.to_dict()、.dict());如果没有提供专用方法,可以通过__dict__属性提取实例属性,过滤掉内置私有字段;如果字段固定,手动映射每个字段是最稳妥的方案,避免遗漏嵌套的自定义对象。 - 发送POST请求时直接使用
requests提供的json参数传参,不需要手动调用json.dumps(),也不需要手动设置Content-Type: application/json请求头,requests会自动完成序列化和头设置,减少人为出错概率。
修复后的完整可运行代码参考:
import requests def get_data(): try: api_response = client_api.get() data = [] for i in api_response: # 选择适配你所用SDK的properties转换方式 # 方式1:SDK自带转字典方法(优先使用) # props = i.properties.to_dict() # 方式2:通过__dict__提取属性,过滤私有字段 props = {k: v for k, v in i.properties.__dict__.items() if not k.startswith("_")} # 方式3:字段固定时手动映射(最稳妥,不会漏转嵌套对象) # props = { # "property1": i.properties.property1, # "property2": i.properties.property2, # "property3": i.properties.property3 # } event = { "eventId": i.event_id, "eventType": i.event_type, "properties": props } data.append(event) return data except Exception as e: print(f"拉取API数据失败: {e}") return [] if __name__ == "__main__": webhook_url = "替换为你的实际webhook地址" payload = get_data() resp = requests.post(webhook_url, json=payload) # 校验请求状态,非2xx状态码会直接抛错方便排查 resp.raise_for_status() print("推送成功,响应内容:", resp.text)
注意:如果用
__dict__转换后仍然报序列化错误,说明properties内部还嵌套了其他自定义类型对象,此时建议使用手动映射字段的方式处理,确保传入的所有值都是JSON支持的原生类型(字符串、数字、布尔值、列表、字典、None)。
内容的提问来源于stack exchange,提问作者fizzbuzzzzz
相关产品推荐
相关产品推荐

