使用execjs报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
时间: 2025-01-26 18:00:56 浏览: 74
当使用 execjs
执行 JavaScript 代码并与 Python 进行交互时,如果遇到了 json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
错误,这意味着试图解析的字符串实际上为空或不是有效的 JSON 格式。针对这种情况,我们来逐步排查和解决:
排查步骤
1. 验证JavaScript函数返回值
首先需要确保从 JavaScript 函数返回的结果是一个有效且非空的 JSON 字符串。可以临时添加一些调试信息到您的脚本中去查看实际返回的内容是什么。
# ... [其他代码保持不变]
result = js.call('res', dmw)
print("Returned raw data:", result) # 添加这一行用于打印原始返回值
if isinstance(result, str):
try:
parsed_json = json.loads(result)
print("Parsed JSON:", parsed_json)
except json.JSONDecodeError as e:
print(f"Failed to parse JSON: {e}")
else:
print("Result is not a string.")
2. 检查JavaScript端的问题
确认您使用的 JavaScript 文件(即 h5st参数破解.js
)中的 res
函数工作正常,并能正确生成并返回所需的数据结构。可以在浏览器开发者工具或其他合适的环境中单独测试这个 JS 函数。
3. 确保传入数据格式正确
再次审查传递给 JavaScript 函数的数据(如 dmw
),特别是其中涉及复杂对象的部分(如 enc
)。对于某些特殊字符或者非标准格式,可能会导致无法成功序列化成 JSON。
4. 捕获更多异常信息
增强错误处理部分以便能够获取更多信息关于为什么会失败。除了上面提到的基本检查外,还可以记录整个过程的日志文件方便后续分析。
示例修正后的代码
以下是结合上述建议的一个改进版示例:
import json
import execjs
def call_js_function(js_file_path, func_name, *args):
"""辅助函数用于简化调用"""
try:
with open(js_file_path, 'r', encoding='utf-8') as file:
js_code = file.read()
context = execjs.compile(js_code)
result = context.call(func_name, *args)
print("Raw Return Value From JS:", result)
if isinstance(result, str):
return json.loads(result.strip())
else:
raise TypeError("Expected a JSON-string but got another type.")
except FileNotFoundError:
print(f"The specified file '{js_file_path}' does not exist.")
except execjs.ProgramError as pe:
print(f"A program error occurred in the JS code:\n{pe}")
except Exception as exc:
print(exc)
# 实际应用案例
data_to_pass = {
"functionId": "unionSearchRecommend",
"appid": "unionpc",
"body": enc,
}
response = call_js_function('h5st参数破解.js', 'res', data_to_pass)
print(response or "No response received")
在这个版本里,我们将核心逻辑封装进了一个独立的帮助函数里面,并增强了对各种可能抛出的不同类型异常的支持,同时加入了额外的日志输出点以供调试之需。
相关问题
--
- 如何确保 JavaScript 返回的有效 JSON 格式的最佳实践有哪些?
- 使用
execjs
调试过程中应该注意哪些常见误区? - 在 Python 和 JavaScript 之间共享复杂对象的最佳策略是什么?
希望这些指导可以帮助您找到解决方案,并让程序顺利运行起来!如果有任何疑问或者其他技术难题,请随时告诉我。
相关推荐


















