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

Python 2.7将JSON文件映射为对象报TypeError如何解决

错误产生原因

json.loads()的作用是解析JSON格式的字符串/字节缓冲区内容为Python对象,它不支持直接传入文件句柄对象。你的代码里直接把open()返回的文件对象作为第一个参数传给了loads(),类型不匹配,因此抛出TypeError: expected string or buffer错误。

另外代码还有几个非致命但影响可维护性的常见问题:

  • object_hook里生成的namedtuple固定命名为X,如果JSON存在嵌套结构,所有层级转出来的对象类型名全是X,调试排查问题时很难区分
  • 打开文件时没有显式指定文件编码,在Windows等系统下默认用系统编码读取JSON文件,很容易因为编码不匹配触发解析错误
  • 入参名dictonary存在拼写错误,正确拼写为dictionary,虽然不影响运行但可读性差
修复方案

处理JSON文件时直接使用json.load()即可,这个方法原生支持接收可读文件对象,会自动读取文件内容完成解析,不需要手动调用.read()读内容,是读写JSON文件的标准写法。

修正后的完整代码:

from json import load
from collections import namedtuple
from os import path

class CamConfigurator:
    with open(path.join('utility', 'cam', 'configurator.json'), encoding='utf-8') as __configFile:
        __configurator = load(
            __configFile,
            object_hook=lambda dictionary: namedtuple(
                'CamConfig', dictionary.keys()
            )(*dictionary.values())
        )
    camIndex = __configurator.availableCams[-1]
    pathToSnapshots = __configurator.pathToSnapshots

如果你坚持要使用json.loads(),只需要把传入的第一个参数改为__configFile.read(),手动读取文件全量内容为字符串再传入解析即可,逻辑和上面的写法等价,但写法更冗余。


内容的提问来源于stack exchange,提问作者Memmo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:06:24