我有一个字典,我发送给API,不幸的是,API要求字典按照特定的顺序。我正在从文件中加载字典。
现在json.load(fh, object_pairs_hook=OrderedDict)
完全符合它的要求并按字母顺序排列顶级键,但我需要以不同方式排序字典。
具体顺序:
{
"kind": "string",
"apiVersion": "string",
"metadata": {...},
"spec": {
"subKey": "string"
}
}
如何使用从文件加载的词典指定顶级和子级别键的字典顺序?
答案 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])))