首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python JSON排序嵌套数据

Python JSON排序嵌套数据
EN

Stack Overflow用户
提问于 2018-12-04 02:53:43
回答 2查看 1.8K关注 0票数 3

尝试找到对嵌套json数据进行排序的最简单方法。到目前为止,我所尝试的一切似乎都失败了。我使用的是Python 2.7,并尝试按名称属性排序。这是我尝试过的众多python示例中的一个:

代码语言:javascript
复制
    def sort_json(self,json_data):
        data_obj = json.dumps(json_data,sort_keys=True)
        return sorted(data_obj["data"]["workflows"]["allWorkflows"], 
        key=lambda d: d["name"])

下面是一个未排序的json示例:

代码语言:javascript
复制
{
  "data": {
    "workflows": {
      "allWorkflows": [{
        "name": "ICX-SLX Config Basic Support",
        "version": 106,
        "path": "/Workflows/System/Config/Basic Support/ICX-SLX Config Basic Support"
      }, {
        "name": "ICX Upgrade Firmware",
        "version": 37,
        "path": "/Workflows/System/Inventory/Upgrade/ICX Upgrade Firmware"
      }, {
        "name": "Quarantine_PCAP_Flow",
        "version": 357,
        "path": "/Workflows/System/Security/Quarantine_PCAP_Flow"
      }, {
        "name": "ICX-MLX Backup Configuration",
        "version": 101,
        "path": "/Workflows/System/Inventory/Backup/ICX-MLX Backup Configuration"
      }, {
        "name": "ICX-SLX-MLX Restart Device",
        "version": 15,
        "path": "/Workflows/System/Inventory/Restart/ICX-SLX-MLX Restart Device"
      }, {
        "name": "Revert_Quarantine_End_System",
        "version": 169,
        "path": "/Workflows/System/Security/Revert_Quarantine_End_System"
      }]
    }
  }
}

任何工作中的例子都会非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2018-12-04 04:01:57

嗨,Bill:我认为复杂性来自于json文件的三重嵌套。一旦我去掉了开销层并创建了一个新的{name: version,path}字典,那么我就可以排序了:(这可能比你想要的要麻烦一些,但至少它让我明白了这个问题。希望这能对您有所帮助!)

代码语言:javascript
复制
import json

with open("sample.json") as json_data:
    d = json.load(json_data)

key = 'data'
key2 = 'workflows'
key3 = 'allWorkflows'

list1 = []
list2 = []
list3 = []

for k in d[key][key2][key3]:
    name_d = k
    list1.append(name_d['name'])
    list2.append(name_d['version'])
    list3.append(name_d['path'])

mydict = {i:[j, k] for i, j, k in zip(list1, list2, list3)}
print(sorted(mydict.items()))
票数 0
EN

Stack Overflow用户

发布于 2022-01-15 00:42:18

您可以使用(部分完整的)递归解决方案来处理更多级别/嵌套:

input.json

{"foo": {"bar": [3,2,1], "bax": {"buz": [6,5,4]}}, "too": [9,8,7], "farm": [{"boo": [7,6]}, {"coo": ["def", "abc"]}, {"loo": {"dog": [6,9,1], "cat": [{"fog": [3,2,1]}]}}]}

expected.json

{"foo": {"bar": [1,2,3], "bax": {"buz": [4,5,6]}}, "too": [7,8,9], "farm": [{"boo": [6,7]}, {"coo": ["abc", "def"]}, {"loo": {"dog": [1,6,9], "cat": [{"fog": [1,2,3]}]}}]}

函数

代码语言:javascript
复制
def sort_json(payload: Dict) -> Dict:
  for k, v in payload.items():
    if isinstance(v, dict):
      sort_json(v)
    else:
      if all(isinstance(x, int) or isinstance(x, str) for x in v):
        v.sort()
      if all(isinstance(x, dict) or isinstance(x, dict) for x in v):
        for j in v:
          sort_json(j)
  return payload
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53600076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档