You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:27:07