【问题标题】:JSON library exception in Python 3Python 3 中的 JSON 库异常
【发布时间】:2015-10-04 06:42:11
【问题描述】:

由于 Python 2 API 似乎搞砸了——从文件系统函数中,我有时会得到 unicode 字符串,有时是标准字符串——我现在正在尝试从 Python 2 过渡到 Python 3。但是在这样做的同时我遇到了关于json 模块。

我使用 Python 3.4 运行标准 Ubuntu 系统。当我尝试使用 JSON 模块时,我收到以下错误消息:

Traceback (most recent call last):
  File "./sysmon.py", line 227, in <module>
    jsonCfgObj = json.load(json_file, 'utf-8', strict = False)
  File "/usr/lib/python3.4/json/__init__.py", line 268, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/usr/lib/python3.4/json/__init__.py", line 331, in loads
    return cls(**kw).decode(s)
TypeError: 'str' object is not callable

乍一看,这似乎是 Python 3 的 JSON 模块中的一个错误。我简直不敢相信,因为我没有做任何不寻常的事情:我只是阅读了一个非常非常简单的 JSON 配置文件.

您对如何处理此错误有任何想法吗?

【问题讨论】:

  • 你的代码是什么样的?那会很有帮助
  • 查看堆栈跟踪:"jsonCfgObj = json.load(json_file, 'utf-8', strict = False)" 如果我​​删除 'utf-8' 一切正常,只要我可以看到。但是后来我在回溯模块的原始代码中得到了一些其他错误。我对其他编程语言有很多经验,所以对我来说,在原始模块代码中没有出现常规异常而是出现错误似乎是一种非常奇怪的行为。这是python3的典型吗?在python2中我从来没有遇到过这样的事情。但那是完全不同的东西。

标签: python json python-3.x


【解决方案1】:

json.load() in Python 3 不接受二进制文件,因此删除了第二个参数encoding

'utf-8' 在这里被解释为cls 参数,它与导致您看到的TypeError 的编码无关。从json.load() 调用中删除'utf-8' - 您应该将编码传递给打开文件的代码:

import json

with open('text.json', encoding='utf-8') as file:
    data = json.load(file)

【讨论】:

    【解决方案2】:

    json.load 在 Python 2 中的第二个参数是 encoding,但在 Python 3 中第二个参数是 cls,它必须是 None(默认)或 JSONDecoder 子类。 json.load的签名现在是

    json.load(fp, cls=None, ...)
    

    您需要从参数列表中删除'utf-8'(改为将其传递给文件打开器)。


    OTOH json.loads 仍然encoding 参数,但它“被忽略和弃用”。

    【讨论】:

    • 感谢您的回答。仅供参考:无论规范怎么说,它似乎都没有被“忽略”,因为否则我不会遇到那个错误。但是thanx,解决了问题!
    • @RegisMay 它在json.loadsjson.load 忽略,根本不允许encoding 参数。另外,如果你觉得我的回答对你有帮助,你可以accept my answer
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 2017-06-09
    • 2023-03-18
    • 2019-04-09
    • 2021-12-14
    • 2022-08-10
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多