python3 json dumps顺序_如何使用Python 3 json.dumps固定JSON密钥顺序?

I've noticed some strange behavior on Python 3's implementation of json.dumps, namely the key order changes every time I dump the same object from execution to execution. Googling wasn't working since I don't care about sorting the keys, I just want them to remain the same! Here is an example script:

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))

When I run this script I get different outputs every time, for example:

$ 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

}

But then I run it again and I get:

$ python print_data.py

{

"email": "john.doe@example.com",

"balance": 235.03,

"name": "John Doe",

"nested": {

"value": 2153.23412,

"complex": true

},

"isadmin": false,

"groceries": [

"apples",

"bananas",

"pears"

],

"number": 42

}

I understand that dictionaries are unordered collections and that the order is based on a hash function; however in Python 2 - the order (whatever it is) is fixed and doesn't change on a per-execution basis. The difficulty here is that it's making my tests difficult to run because I need to compare the JSON output of two different modules!

Any idea what is going on? How to fix it? Note that I would like to avoid using an OrderedDict or performing any sorting and what matters is that the string representation remains the same between executions. Also this is for testing purposes only and doesn't have any effect on the implementation of my module.

解决方案

Python dictionaries and JSON objects are unordered. You can ask json.dumps() to sort the keys in the output; this is meant to ease testing. Use the sort_keys parameter to True:

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

You can set the PYTHONHASHSEED environment variable to an integer value to 'lock' the dictionary order; use this only to run tests and not in production, as the whole point of hash randomisation is to prevent an attacker from trivially DOS-ing your program.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值