json loads keep order

最近在看豆瓣API快速入门, 输入如下api到浏览器的地址栏,Enter

https://api.douban.com/v2/book/1220562

{“rating”:{“max”:10,”numRaters”:368,”average”:”7.3”,”min”:0} …

返回值为json, 单行压缩的文本不便于阅读,需要tabify一下。

Tabify

python内置了标准库json, json库的dumps函数可以实现tabify功能。过程如下:
从Server上Requert数据,用json.dumps Tabify后, 存盘。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -*- coding:utf-8 -*-
import json
import urllib.request

def GetDoubanBook2Json(url):
with urllib.request.urlopen(url) as f:
cc = json.loads(f.read().decode('utf-8'), encoding='utf-8')

save_file_name = url[url.rfind('/')+1:] + '.json'
with open(save_file_name, 'w', encoding='utf-8') as f:
f.write(json.dumps(cc, indent=4, ensure_ascii=False))

if __name__ == '__main__':
url = 'https://api.douban.com/v2/book/1220562'
GetDoubanBook2Json(url)

Keep Order

和之前的单行压缩文本对比,发现json的key的顺序发生了变化。Google了一下,python-json-loads-changes-the-order-of-the-object给了Solution:

1
2
from collections import OrderedDict
data_content = json.loads(input_data.decode('utf-8'), object_pairs_hook=OrderedDict)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding:utf-8 -*-
import json
from collections import OrderedDict
import urllib.request

def GetDoubanBook2Json(url):
with urllib.request.urlopen(url) as f:
# object_pairs_hook = OrderedDict, keep order
cc = json.loads(f.read().decode('utf-8'), object_pairs_hook = OrderedDict, encoding='utf-8')

save_file_name = url[url.rfind('/')+1:] + '.json'
with open(save_file_name, 'w', encoding='utf-8') as f:
f.write(json.dumps(cc, indent=4, ensure_ascii=False))

if __name__ == '__main__':
url = 'https://api.douban.com/v2/book/1220562'
GetDoubanBook2Json(url)

结果对比如图:

python-json-loads-keep-order

Reference