Python中json.dumps序列化仅返回ffid未输出真实值如何修复
问题原因
json.dumps 仅支持序列化Python原生数据类型,你通过javascript库调用Node.js模块获取的返回值是JavaScript对象代理,并非原生Python字典/列表/字符串类型,序列化时无法正确读取对象内部属性,才会出现字段缺失、输出无关ffid字段的异常结果。
你看到的执行序列化前的对象打印内容是JS对象的输出格式,其中width/height这类键没有引号是JS对象语法,不是合法的Python字典写法,不要直接复制到Python代码中运行。
可行修复方案
- 优先方案:调用代理对象自带的转换方法转原生结构
PyExecJS封装的JS对象代理自带to_dict()方法,可以直接把JS对象递归转换成Python原生字典/列表,在拿到接口返回值后先做一次转换再走后续逻辑即可,修改后的完整代码如下:
import json from javascript import require twitterGetUrl = require('twitter-url-direct') link = twitterGetUrl('https://twitter.com/Porsche/status/1469439221920370690?t=6l5RFIahtPkxhHJkNDhfbg&s=19', timeout=600) # 核心转换步骤:把JS代理对象转为Python原生字典 link = link.to_dict() linksx = [] for item in link['download']: if item.get('dimension'): linksx.append(item) medias = { 'ok': True, 'type': 'video', 'download': linksx } print(json.dumps(medias, ensure_ascii=False))
- 兼容方案:自定义JSON编码器自动处理JS代理对象
如果遇到嵌套层级较深、手动转换遗漏的场景,可以自定义JSON序列化编码器,遇到JS代理类型时自动做类型转换,无需手动逐个调用转换方法:
import json from javascript import require, JSObject class JSObjectEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, JSObject): return obj.to_dict() return super().default(obj) # 序列化时指定自定义编码器即可 print(json.dumps(medias, cls=JSObjectEncoder, ensure_ascii=False))
- 兜底方案:在JS侧完成序列化后回传
如果上述两种方案仍存在类型兼容问题,可以直接在调用JS模块时让JS侧把结果序列化为JSON字符串,回传到Python后再用json.loads解析为原生对象,完全绕开JS代理对象的序列化问题。
内容的提问来源于stack exchange,提问作者xgorn
相关产品推荐
相关产品推荐

