我想用ujson保持OrderedDict的顺序

时间:2016-07-06 03:18:38

标签: python ordereddictionary ujson

我的函数的返回值类型是OrderedDict

现在我想在文件上写这个:

这是我的代码:

mainDict = OrderedDict([('a',1),('b',2),('c',3),('d',[4,5,6])])
with open(outFileName, 'w', encoding='utf-8') as outFile :
   outFile.write(ujson.dumps(mainDict, indent=4))

我希望它能保持文件中字典的顺序,但它已经混淆了。

是因为使用ujson.dumps吗?如何在输出文件中保留OrderedDict的顺序?

3 个答案:

答案 0 :(得分:5)

使用sort_keys

ujson.dumps参数

ujson的行为如下:

  • sort_keys=None(如果省略则默认) - 以实现定义的顺序转储dict键,每次启动时可能不同(但速度很快)
  • sort_keys=True - 在转储前排序dict键
  • sort_keys=False - 保留dict.items()
  • 提供的dict键顺序

为了保留OrderedDictujson的排序,您需要sort_keys=False

测试

这是你可以检查它的方法:

import sys
import ujson

order = None
if len(sys.argv) == 2:
    order = bool(int(sys.argv[1]))

mainDict = OrderedDict([('c',3),('b',2),('a',1)])
sys.stdout.write(ujson.dumps(mainDict, sort_keys=order))

试验:

$ python order.py      # sort_keys=None
{"c":3,"a":1,"b":2}

$ python order.py      # sort_keys=None
{"b":2,"c":3,"a":1}

$ python order.py 1    # sort_keys=True
{"a":1,"b":2,"c":3}

$ python order.py 0    # sort_keys=False
{"c":3,"b":2,"a":1}

备注

请注意,与ujson不同,内置json模块会使用sort_keys=None以及sort_keys=False保留关键顺序。

另请注意,尽管可以使用这些实现(ujsonjson)保留键顺序,但它是非标准JSON。见json.org

  

对象是一组无序名称/值对。

答案 1 :(得分:0)

像这样使用

mainDict = OrderedDict([('a',1),('b',2),('c',3),('d',[4,5,6])])
with open(outFileName, 'w', encoding='utf-8') as outFile :
   outFile.write(ujson.dumps(mainDict, indent=4, sort_keys=False))

答案 2 :(得分:-1)

是的,似乎ujson默认情况下将字典转储为无序字典,与内置的json包不同。将sort_keys参数设置为true以将数据转储为有序字典。

这是我的示例代码:

import ujson
import json
from collections import OrderedDict

mainDict = OrderedDict([('a',1),('b',2),('c',3),('d',[4,5,6])])

# Maintain the ordering of dictionary upon dump.
with open("ordereddict2.txt", 'w') as outFile :
  outFile.write(ujson.dumps(mainDict, indent=4, sort_keys=True))