如何避免字典项随机排序键?

时间:2017-02-28 06:58:59

标签: python json dictionary

我编写了一个函数来获取excel列并将它们放入字典中以输出到json中。当我写json输出时,键值似乎是随机排序的。有没有办法可以按照我添加它们的顺序强制执行键值?

def excel_to_json(filename):
    wb = xlrd.open_workbook(filename)
    sh = wb.sheet_by_index(0)

    # List to hold dictionaries
    c_list = []

    # Iterate through each row in worksheet and fetch values into dict
    for rownum in range(1, sh.nrows):
        cars = OrderedDict()
        row_values = sh.row_values(rownum)
        cars['Name'] = row_values[0]
        cars['Extensions'] = row_values[1]
        cars['Patterns'] = row_values[2]
        cars['RansomNoteFilenames'] = row_values[3]
        cars['Comment'] = row_values[4]
        cars['EncryptionAlgorithm'] = row_values[5]
        cars['AlternateNames'] = row_values[6]
        cars['Decryptor'] = row_values[7]
        cars['AdditionalInfo1'] = row_values[8]
        cars['AdditionalInfo2'] = row_values[9]
        cars['Screenshots'] = row_values[10]

        c_list.append(cars)

    # Serialize the list of dicts to JSON
    return formatJson(json.dumps(c_list))


def formatJson(input):
    return json.dumps(json.loads(input), indent=4)

示例json输出如下所示:

 {
        "Name": "dummydata",
        "Comment": "",
        "AlternateNames": "",
        "Screenshots": "dummydata",
        "RansomNoteFilenames": "dummydata",
        "Decryptor": "",
        "Extensions": "dummydata",
        "AdditionalInfo2": "",
        "Patterns": "",
        "EncryptionAlgorithm": "dummydata",
        "AdditionalInfo1": "dummydata",
    },

正如您所看到的,这里的键与excel_to_json()中的for循环的顺序不同,这使得json的可读性在手动处理时很难。

2 个答案:

答案 0 :(得分:1)

这样做

def formatJson(inp):
    return json.dumps(inp, indent=4)

并称之为

formatJson(c_list)

您正在倾倒并再次加载它。

您的代码也略有改进

for rownum in range(1, sh.nrows):
        cars = OrderedDict()
        row_values = sh.row_values(rownum)
        row_names = ['Name','Extensions','Patterns','Comment',....]
        for i in range(len(row_values)):
            cars[row_names[i]] = row_values[i]

        c_list.append(cars)

答案 1 :(得分:1)

这取决于您使用的json序列化程序是否真正遵守OrderedDict中的订单。你可以尝试另一个(例如simplejson)并查看它是否有效。它们都是API兼容的。

此外,大多数json.dumps实现都有一个sort_keys参数,它将按字母顺序对所有键进行排序。当您希望拥有数据的稳定表示时,这非常有用,例如:差异等等。

P.S。

此外,如果您使用内置zip内容,则可以使代码更加简单。

columns = ['Name', 'Extension', 'Patterns']
row = ['Foo', 'Bar', 'Baz']
OrderedDict(zip(columns, row))

给出

OrderedDict([('Name', 'Foo'), ('Extension', 'Bar'), ('Patterns', 'Baz')])