【问题标题】:How to get original JSON format order after updating new key value?更新新键值后如何获取原始 JSON 格式顺序?
【发布时间】:2022-01-02 23:37:31
【问题描述】:

我在 JSON 值中更新了一个新的 JSON 键值,但是当我写入 JSON 文件的顺序时发生了变化,那么如何用新的更新键值得到我原来的顺序?

原始 JSON 格式:

value = [
    {
      "result": [
                        {
                              "allow": "notes",
                              "url": "https://google.com",
                              "np_url": "https://www.google.com/downloads/",
                              "rank": "2"
                              "info": "ok"
                        },
                        {
                              "allow": "notes2",
                              "url": "https://www.yahoo.com",
                              "np_url": "https://imp.com/download",
                              "rank": "7",
                              "info": "cancel"
                         },
                    ]
    }
]

当我添加新的键和值时,我编写 JSON 时顺序会发生变化。

打印值显示原始值,但是当我编写和使用sort_keys = True 并且没有sort_keys = True 时,它也会得到不同的JSON 格式顺序

代码:

if
  ....
  kk['art'] = pencil
else
  ...
  kk['art'] = pencil

print(value)

import json
with open("example.json", "w", encoding='utf-8') as f:
    json.dump(value, f, ensure_ascii=False,indent=4, sort_keys=True)

输出:

value = [
    {
      "result": [
                        {
                              "allow": "notes",
                              "art": "pencil",
                              "url": "https://google.com",
                              "info": "ok"
                              "np_url": "https://www.google.com/downloads/",
                              "rank": "2"
                        },
                        {
                              "allow": "notes2",
                              "art": "pen",
                              "url": "https://www.yahoo.com",
                              "info": "cancel"
                              "np_url": "https://imp.com/download",
                              "rank": "7",
                         },
                    ]
    }
]

预期输出:

value = [
    {
      "result": [
                        {
                              "allow": "notes",
                              "art": "pencil",
                              "url": "https://google.com",
                              "np_url": "https://www.google.com/downloads/",
                              "rank": "2"
                              "info": "ok"
                        },
                        {
                              "allow": "notes2",
                              "art": "pen",
                              "url": "https://www.yahoo.com",
                              "np_url": "https://imp.com/download",
                              "rank": "7",
                              "info": "cancel"
                         },
                    ]
    }
]

【问题讨论】:

  • 如果你想保留订单你需要停止做sort_keys=True
  • 您需要使用您想要的键的自定义顺序创建整个字典。但是你知道顺序与 JSON 无关吧?
  • 创建整个字典,不要使用sort_keys=True。我以为最后一个被理解了。
  • 字典保持键的顺序(3.7+)。您将键添加到字典的顺序是您将看到它们呈现的顺序。如果您添加一个新密钥,它将是最后一个。如果您需要指定字典中键的顺序,您必须自己按该顺序插入它们。如果您必须重新排序键(出于某种原因),您可以使用 sorted()items() 上创建一个新字典,您可以在其中控制排序功能。
  • @Angeline 你用的是什么版本的 Python?我无法重现您使用 Python 3.7 获得的输出,相反,我得到了原始结构的顺序,"art" 出现在末尾。

标签: python json python-3.x


【解决方案1】:

如果您出于某种原因需要设置字典中项目的顺序,则必须按照您选择的键顺序添加项目。 Python 将键插入顺序保留为语言功能 (3.7+)。

我可以想到一些您可以执行此操作的方法,例如创建具有 None 值的模板字典并将其克隆以在结果列表中创建单个项目。

我认为,尽管我建议您进行任何您想要的数据操作,然后迭代结果列表,并为列表中的每个项目,使用预期的键顺序重建它。

这似乎很简单,可以开始。

value = [
    {
        "result": [
            {
                "allow": "notes",
                "art": "pencil",
                "url": "https://google.com",
                "info": "ok",
                "np_url": "https://www.google.com/downloads/",
                "rank": "2"
            },
            {
                "allow": "notes2",
                "art": "pen",
                "url": "https://www.yahoo.com",
                "info": "cancel",
                "np_url": "https://imp.com/download",
                "rank": "7",
            },
        ]
    }
]

def set_key_order(my_dict):
    key_order = ["allow", "art", "url", "np_url", "rank", "info"]
    return {key: my_dict[key] for key in key_order if key in my_dict.keys()}

value[0]["result"] = [set_key_order(x) for x in value[0]["result"]]

print(value)

这将为您提供如下所示的结果:

[
    {
        'result': [
            {
                'allow': 'notes',
                'art': 'pencil',
                'url': 'https://google.com',
                'np_url': 'https://www.google.com/downloads/',
                'rank': '2',
                'info': 'ok'
            },
            {
                'allow': 'notes2',
                'art': 'pen',
                'url': 'https://www.yahoo.com',
                'np_url': 'https://imp.com/download',
                'rank': '7',
                'info': 'cancel'
            }
        ]
    }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 2017-06-07
    • 1970-01-01
    • 2014-12-24
    • 2020-05-10
    • 2019-09-25
    • 2018-11-18
    • 2023-03-29
    相关资源
    最近更新 更多