Miniconda中json.dumps报错,与Homebrew Python行为差异原因问询
关于Anaconda与Homebrew Python中json.dumps行为差异的解答
首先直接给结论:这种差异大概率不是Anaconda发行版本身修改了标准库json的行为,更可能是你的Miniconda环境里存在第三方json库(比如simplejson)覆盖了标准库,或者两个环境的Python版本/依赖库版本不一致导致的。
下面具体拆解原因和排查方向:
1. 最常见的原因:误用了simplejson而非标准库json
Python标准库的json模块(从Python 3.x开始)会自动将字典的整数键转换为字符串,比如运行json.dumps({1: "test"})会输出{"1": "test"},不会报错。但如果你在Miniconda环境里安装了simplejson,并且代码里写了import simplejson as json,那情况就不一样了:
- 旧版本的
simplejson默认不支持非字符串类型的键,调用simplejson.dumps({1: "test"})就会抛出TypeError: keys must be a string的错误; - 而Homebrew的Python环境里可能没有安装
simplejson,所以默认使用的是标准库的json,自然不会报错。
快速排查方法
在Miniconda环境里运行以下代码:
import json print(json.__file__)
如果输出路径里包含simplejson字样,说明你确实误用了第三方库。
2. Python版本差异
如果你的Miniconda环境用的是Python 2.x(虽然Flask现在更推荐3.x,但不排除旧环境),那标准库的json模块确实会对非字符串键报错——Python 2.x的json模块严格遵循早期的JSON规范,不允许非字符串键;而Python 3.x的标准库json已经做了兼容,会自动转换整数键为字符串。
3. Anaconda环境的依赖特殊情况
虽然Anaconda的Python大多基于官方CPython发行版,但某些定制化的Anaconda环境可能会替换标准库的json实现(比如为了性能使用第三方编译版本),但这种情况非常罕见。
解决建议
- 修正导入语句:确保代码里用的是标准库的
json,即import json,而非import simplejson as json; - 升级依赖:如果确实需要使用
simplejson,在Miniconda环境里运行conda install -c conda-forge simplejson升级到最新版本,新版本的simplejson已经支持自动转换非字符串键; - 手动转换键:如果上述方法都无法实施,可以提前将字典的整数键转换为字符串:
converted_dict = {str(key): value for key, value in aDict.items()} json_str = json.dumps(converted_dict) - 统一环境版本:检查两个环境的Python版本,尽量保持一致,避免版本差异带来的行为不同。
内容的提问来源于stack exchange,提问作者Dustin Michels
相关产品推荐
相关产品推荐

