加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何使用Python 3 json.dumps修复JSON密钥顺序?

发布时间:2020-12-16 22:57:10 所属栏目:Python 来源:网络整理
导读:我注意到 Python 3的json.dumps实现有一些奇怪的行为,即每次我将同一个对象从执行转储到执行时,键顺序都会改变.谷歌搜索没有工作,因为我不关心按键排序,我只是希望它们保持不变!这是一个示例脚本: import jsondata = { 'number': 42,'name': 'John Doe','e
我注意到 Python 3的json.dumps实现有一些奇怪的行为,即每次我将同一个对象从执行转储到执行时,键顺序都会改变.谷歌搜索没有工作,因为我不关心按键排序,我只是希望它们保持不变!这是一个示例脚本:
import json

data = {
    'number': 42,'name': 'John Doe','email': 'john.doe@example.com','balance': 235.03,'isadmin': False,'groceries': [
        'apples','bananas','pears',],'nested': {
        'complex': True,'value': 2153.23412
    }
}

print(json.dumps(data,indent=2))

当我运行此脚本时,每次都会得到不同的输出,例如:

$python print_data.py 
{
  "groceries": [
    "apples","bananas","pears"
  ],"isadmin": false,"nested": {
    "value": 2153.23412,"complex": true
  },"email": "john.doe@example.com","number": 42,"name": "John Doe","balance": 235.03
}

但后来我再次运行它,我得到:

$python print_data.py 
{
  "email": "john.doe@example.com","balance": 235.03,"groceries": [
    "apples","number": 42
}

我知道字典是无序集合,并且顺序基于散列函数;但是在Python 2中 – 顺序(无论它是什么)是固定的,并且不会在每次执行的基础上改变.这里的困难在于它使我的测试难以运行,因为我需要比较两个不同模块的JSON输出!

知道发生了什么事吗?怎么解决?请注意,我想避免使用OrderedDict或执行任何排序,重要的是字符串表示在执行之间保持不变.此外,这仅用于测试目的,对我的模块的实现没有任何影响.

解决方法

Python字典和JSON对象是无序的.你可以让json.dumps()对输出中的键进行排序;这是为了方便测试.将sort_keys参数用于True:
print(json.dumps(data,indent=2,sort_keys=True))

请参阅Why is the order in Python dictionaries and sets arbitrary?,了解每次看到不同订单的原因.

您可以将PYTHONHASHSEED environment variable设置为整数值以“锁定”字典顺序;使用它只运行测试而不是生产,因为哈希随机化的重点是防止攻击者轻易地对你的程序进行DOS操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读