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
相关产品推荐
相关产品推荐

