首页 > 解决方案 > Python中的JSON转储顺序

问题描述

我正在尝试使用特定格式写入 JSON。我尝试了不同的方法来制作 json.dump 命令以将数据在变量中的呈现方式写入文件。任何尝试的 OrderDict 和 Sort-Keys 建议,之前和在线都推荐过。

2020年 1 月 7 日 - 这是 JSON 文件的订单和创建代码。

    data =[]
    subData=[]
    subData=media_add()
    data.append(OrderedDict(
        {
            "values": [ {
                "CaseID": case_id,
                "CaseMetadata": [
                    {
                        "CaseID":case_id,
                        "PropertyName":case_name,
                        "PropertyValue":case_value
                    }
                ],
                "CaseNumber": case_num,
                "ContactEmail": contact_email,
                "ContactName": contact_name,
                "ContactOrganization": contact_org,
                "ContactPhone": contact_phone,
                "ContactTitle": contact_title,
                "Media": subData,
                
                "TotalMediaFiles": len(final_results),
                "TotalPrecategorized": 0,
                
                "SeizureDate": autData[3][1],
                "SourceApplicationName": "Autopsy",
                "SourceApplicationVersion": autData[5][1]
                }]}))


    # Serializing json  
    json_object = json.dumps(data, indent=5)

    # Writing to json file

    filename= (case_name_fn + " " + date_fn + "." + time_fn + ".json")


    with open(filename, "w") as outfile: 
        json.dump(data, outfile, sort_keys=True, indent = 4, ensure_ascii = False)

更新04/09/2020 下午好,由于具体要求,Python代码需要用Python 2.7编写。我试图在 2.7 而不是 3.6 中重做上述工作,就像原始代码一样,但是我无法让转储保持在代码中写入的顺序。我重新尝试使用 OrderedDict 但这失败了。

是否有另一种方法可以在不使用 json.dump 方法的情况下创建结构化 JSON 文件。

标签: pythonjson

解决方案


要以插入它们的相同顺序打印值,您需要做两件事:

  • 不要sort_keys=True像在转储到文件的示例中那样设置。这将按字母顺序对它们进行排序,而不是按插入顺序。
  • 至少使用 Python 3.6。

第二个是必要的,因为在 Python 3.6 之前,字典不记得插入元素的顺序。如果您设置x = {'a': 1, 'b': 2}然后迭代它,那么您可能会按顺序'a', 'b''b', 'a'. 它甚至可能在同一程序的运行之间发生变化!

如果您坚持使用 Python 3.5 或更早版本,则可以使用 anOrderedDict代替。我知道这就是你现在正在做的。但是您使用{...}文字语法,它将值放在 a 中dict,因此在到达之前订单已经丢失OrderedDict。相反,您必须使用列表或元组:

data.append(OrderedDict(
    [
        ["values", [ [
            ["CaseID", case_id],
            ["CaseMetadata", [
                [
                    ["CaseID", case_id],
                    ["PropertyName", case_name],
                    ["PropertyValue", case_value]
                ]

... 等等。如您所见,它非常繁琐。最好只是升级你的 Python 版本。也许您只是偶然使用了 Python 2.7,因为这通常是您python在命令提示符下运行所得到的。在这种情况下,您可以通过运行来解决您的问题python3


推荐阅读