在Python中具有特定顺序的OrderedDict

时间:2015-10-28 18:26:39

标签: python json dictionary

我有一个字典,我发送给API,不幸的是,API要求字典按照特定的顺序。我正在从文件中加载字典。

现在json.load(fh, object_pairs_hook=OrderedDict)完全符合它的要求并按字母顺序排列顶级键,但我需要以不同方式排序字典。

具体顺序:

{
  "kind": "string",
  "apiVersion": "string",
  "metadata": {...},
  "spec": {
    "subKey": "string"
  }
}

如何使用从文件加载的词典指定顶级和子级别键的字典顺序?

2 个答案:

答案 0 :(得分:3)

在Python中,OrderedDict中项目的顺序遵循它们写入的顺序。

因此,如果您想在创建OrderedDict时控制项目的顺序,则可以按所需顺序编写。对于现有的OrderedDict,您可以按顺序读取,删除和回写每个项目。

在您的示例中,如果您需要调整项目的顺序,您可以这样做:

orders = ("kind", "apiVersion", "metadata", "spec")
for key in orders:
    v = object_pairs_hook[key]
    del object_pairs_hook[key]
    object_pairs_hook[key] = v

答案 1 :(得分:2)

在这种情况下你不需要objects_pairs_hook,只需加载json文件并使用自定义排序从中创建OrderedDict

SORT_ORDER = {
    "kind": 0,
    "apiVersion": 1,
    "metadata": 2,
    "spec": 3
}

d = json.load(fh)
d = OrderedDict(sorted(d.items(), key=lambda x: SORT_ORDER.get(x[0])))