【问题标题】:Create hierarchical json dump from list of dictionary in python从python中的字典列表创建分层json转储
【发布时间】:2016-06-29 07:21:08
【问题描述】:

桌子:

categories = Table("categories", metadata,
                   Column("id", Integer, primary_key=True),
                   Column("name", String),
                   Column("parent_id", Integer, ForeignKey("categories.id"),
                          CheckConstraint('id!=parent_id'), nullable=True),

)

一个类别可以有多个子级,但只有一个父级。我使用 CTE 获得了如下字典值列表:例如。对于 id :14,parent 是 13,并且从 parent 8->10->12->13->14 遍历,其中 parent 8 没有 parent id。

[
    {
      "id": 14, 
      "name": "cat14", 
      "parent_id": 13, 
      "path_info": [
        8, 
        10, 
        12, 
        13, 
        14
      ]
    }, 
    {
      "id": 15, 
      "name": "cat15", 
      "parent_id": 13, 
      "path_info": [
        8, 
        10, 
        12, 
        13, 
        15
      ]
    }
  ]

我想将父级的属性也作为子类别嵌入到列表中:

{
  "id": 14, 
  "name": "cat14", 
  "parent_id": 13, 
  "subcats": [
       {
         "id: 8", 
         "name": "cat8", 
         "parent_id":null
       }, 
       {
         "id: 10", 
         "name": "cat10", 
         "parent_id":8
       },  
       {
         "id: 12", 
         "name": "cat12", 
         "parent_id":10
       },   
      and similarly for ids 13 and 14..... 
     ]
}, 
{
  "id": 15, 
  "name": "cat15", 
  "parent_id": 13, 
  "subcats": [
       {
         "id: 8", 
         "name": "cat8", 
         "parent_id":null
       }, 
       {
         "id: 10", 
         "name": "cat10", 
         "parent_id":8
       },  
       {
         "id: 12", 
         "name": "cat12", 
         "parent_id":10
       },   
       and similarly for ids 13, 14, 15..... 
     ]
}

] 请注意,'path_info' 已从字典中删除,并且每个 id 都已显示其详细信息。我想要具有上述缩进格式的 json 转储。怎么走?使用烧瓶 0.10、python 2.7

【问题讨论】:

    标签: python json flask


    【解决方案1】:

    通过一些列表/字典推导可以做到这一点。

    lst = [{"id": 14, "name": "cat14", "parent_id": 13, "path_info": [8, 10, 12, 13, 14]}, {"id": 15, "name": "cat15", "parent_id": 13, "path_info": [8, 10, 12, 13, 15]}]
    
    master_dct = { d['id'] : d for d in lst}
    for d in lst:
        d['subcats'] = [{field : master_dct[i][field] for field in ['id', 'name', 'parent_id']} \
            for i in d['path_info'] if i in master_dct]
    
    import json
    with open('out.json', 'w') as f:
        json.dump(lst, f)
    

    【讨论】:

      【解决方案2】:

      pythonic 代码:简单明了

      import json
      categories = [] #input
      def transform(category, child_node_id):
          category['subcats'].append({
             'id': child_node_id,
             'name': 'cat%s' % child_node_id,
             'parent_id': category['id']
          })
      
      
      for category in categories:
          category['subcats'] = []
          [transform(category, child_node_id) for child_node_id in category['path_info']]
          category.pop('path_info', None)
      
      print(json.dumps(categories, indent=4))
      

      【讨论】:

        【解决方案3】:

        您可以在 python 代码中执行它:

        假设我们有一个 json 对象。我稍微修改了一下——添加了缺失的节点并按照规范的要求包装到一个对象中:

            {
              "array": [
                  {
                    "id": 14, 
                    "name": "cat14", 
                    "parent_id": 13, 
                    "path_info": [
                      8, 
                      10, 
                      12, 
                      13, 
                      14
                    ]
                  }, 
                  {
                    "id": 15, 
                    "name": "cat15", 
                    "parent_id": 13, 
                    "path_info": [
                      8, 
                      10, 
                      12, 
                      13, 
                      15
                    ]
                  },
                  {
                    "id": 13, 
                    "name": "cat13", 
                    "parent_id": 12, 
                    "path_info": [
                      8, 
                      10, 
                      12, 
                      13
                    ]
                  },
                 {
                    "id": 12, 
                    "name": "cat12", 
                    "parent_id": 10, 
                    "path_info": [
                      8, 
                      10, 
                      12
                    ]
                  }, 
                  {
                    "id": 10, 
                    "name": "cat10", 
                    "parent_id": 8, 
                    "path_info": [
                      8, 
                      10
                    ]
                  },
                  {
                    "id": 8, 
                    "name": "cat8", 
                    "parent_id": null, 
                    "path_info": [
                      8
                    ]
                  }
                ]
            }
        

        那么你可以使用下面的代码:

            # load data above from file
            j=json.load(open('json_file_above.json'))   # 
        
            #  the array with real data we need
            a=j['array']  
        
            # auxiliary dict which have node identificators as keys and nodes as values
            d={x['id']:x for x in a}  
        
            # here the magic begins :)
            for x in a:
               # add new key with list to each element
               x['subcats'] = [ 
                               # compose dict element for subcats
                               dict(id=i, name=d[i]['name'], parent_id=d[i]['parent_id'])
                               for 
                               i 
                               in [
                                   # we take path_info id list and
                                   # cut off the first element - itself
                                   y for y in x['path_info'][1:]
                                  ]  
                              ]
               del x['path_info']
        

        为了确保你得到你需要的东西:

            >>> print(json.dumps(a, indent=True))
            [
             {
              "name": "cat14",
              "subcats": [
               {
                "name": "cat10",
                "id": 10,
                "parent_id": 8
               },
               {
                "name": "cat12",
                "id": 12,
                "parent_id": 10
               },
               {
                "name": "cat13",
                "id": 13,
                "parent_id": 12
               },
               {
                "name": "cat14",
                "id": 14,
                "parent_id": 13
               }
              ],
              "id": 14,
              "parent_id": 13
             },
             {
              "name": "cat15",
              "subcats": [
               {
                "name": "cat10",
                "id": 10,
                "parent_id": 8
               },
               {
                "name": "cat12",
                "id": 12,
                "parent_id": 10
               },
               {
                "name": "cat13",
                "id": 13,
                "parent_id": 12
               },
               {
                "name": "cat15",
                "id": 15,
                "parent_id": 13
               }
              ],
              "id": 15,
              "parent_id": 13
             },
             {
              "name": "cat13",
              "subcats": [
               {
                "name": "cat10",
                "id": 10,
                "parent_id": 8
               },
               {
                "name": "cat12",
                "id": 12,
                "parent_id": 10
               },
               {
                "name": "cat13",
                "id": 13,
                "parent_id": 12
               }
              ],
              "id": 13,
              "parent_id": 12
             },
             {
              "name": "cat12",
              "subcats": [
               {
                "name": "cat10",
                "id": 10,
                "parent_id": 8
               },
               {
                "name": "cat12",
                "id": 12,
                "parent_id": 10
               }
              ],
              "id": 12,
              "parent_id": 10
             },
             {
              "name": "cat10",
              "subcats": [
               {
                "name": "cat10",
                "id": 10,
                "parent_id": 8
               }
              ],
              "id": 10,
              "parent_id": 8
             },
             {
              "name": "cat8",
              "subcats": [],
              "id": 8,
              "parent_id": null
             }
            ]
            >>>
        

        【讨论】:

          猜你喜欢
          • 2020-07-06
          • 2017-05-05
          • 2020-10-07
          • 2013-10-26
          • 2020-11-17
          • 2018-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多