如何在python中将dict列表转换为嵌套的JSON而不使用DataFram

2024-09-28 21:25:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张这样的单子

[
  {
    "subject_id": 1,
    "subject_name": "HR Sector 0",
    "id": 1,
    "name": "parent2",
    "value": 10.6
  },
  {
    "subject_id": 18,
    "subject_name": "Test11",
    "id": 1,
    "name": "parent2",
    "value": 12
  },
  {
    "subject_id": 2,
    "subject_name": "AG1",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 17
  },
  {
    "subject_id": 3,
    "subject_name": "Finance Group 2",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 1.5
  },
  {
    "subject_id": 10,
    "subject_name": "test",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 10
  },
  {
    "subject_id": null,
    "subject_name": null,
    "id": 3,
    "name": "Technology Team 2",
    "value": null
  },
  {
    "subject_id": 8,
    "subject_name": "Group 4",
    "id": 5,
    "name": "Accounting Group 4",
    "value": 10
  },
  {
    "subject_id": null,
    "subject_name": null,
    "id": 9,
    "name": "PG2",
    "value": null
  }
]

我想把它转换成嵌套的JSON并忽略空值以得到下面的结果集

[
  {
    "id": 1,
    "name": "parent2",
    "subjects”: [
    {”subject_id": 1,
     "subject_name": "HR Sector 0",
        "value": 10.6
    },
    {”subject_id": 18,
     "subject_name": "Test11",
        "value": 12
    }
      ]
  },
  {
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "subjects”: [
        {“subject_id": 2,
        "subject_name": "AG1",
        "value": 17
    },
     {“subject_id": 3,
        "subject_name": "Finance Group 2",
        "value": 1.5
    },
    {“subject_id": 10,
        "subject_name": “test”,
        "value": 10
    }
      ]
  },
  {
    "id": 3,
    "name": "Technology Team 2",
    "subjects”: []
  },
  {
    "id": 5,
    "name": "Accounting Group 4",
    "subjects” : [
        { "subject_id": 8,
        "subject_name": "Group 4",
        "value": 10
     }
      ]
  },
{
    "id": 9,
    "name": "PG2",
    "subjects”: []
  }
]

Tags: nameidvaluegrouphrcustomernullsubject
2条回答
import json

arr = [
  {
    "subject_id": 1,
    "subject_name": "HR Sector 0",
    "id": 1,
    "name": "parent2",
    "value": 10.6
  },
  {
    "subject_id": 18,
    "subject_name": "Test11",
    "id": 1,
    "name": "parent2",
    "value": 12
  },
  {
    "subject_id": 2,
    "subject_name": "AG1",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 17
  },
  {
    "subject_id": 3,
    "subject_name": "Finance Group 2",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 1.5
  },
  {
    "subject_id": 10,
    "subject_name": "test",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 10
  },
  {
    "subject_id": None,
    "subject_name": None,
    "id": 3,
    "name": "Technology Team 2",
    "value": None
  },
  {
    "subject_id": 8,
    "subject_name": "Group 4",
    "id": 5,
    "name": "Accounting Group 4",
    "value": 10
  },
  {
    "subject_id": None,
    "subject_name": None,
    "id": 9,
    "name": "PG2",
    "value": None
  }
]

def process_arr_to_json(arr):
  newArr = []
  addedIds = {}
  for item in arr:
    if(addedIds.get(item["id"]) is None):
      formatted_item = {"subjects":[]}
      newArr.append(formatted_item)
      addedIds[item["id"]] = {"idx": 0, "pos": len(newArr)-1} #index in the dictionary for the subject item
    else:
      formatted_item = newArr[addedIds[item["id"]]["pos"]]
      addedIds[item["id"]]["idx"] += 1
    for k,v in item.items():
      if(v is not None):
        if(k == "id" or k == "name"):
          formatted_item[k] = v
        else:
          if(len(formatted_item["subjects"]) <= addedIds[item["id"]]["idx"]):
            formatted_item["subjects"].append({k:v})
          else:
            formatted_item["subjects"][addedIds[item["id"]]["idx"]][k] = v
  print(newArr)
  return json.dumps(newArr)

if __name__ == "__main__":
  process_arr_to_json(arr)

我的解决方案

请参阅下面的代码以形成合并结果

import json


def process_items(items):
    results = {}
    for item in items:
        results[item['id']] = {
            'id': item['id'],
            'name': item['name'],
        }
        to_append = {}
        for k in ['subject_id', 'value', 'subject_name']:
            if item.get(k):
                to_append[k] = item[k]
        results[item['id']].setdefault('subjects', [])
        if to_append:    
            results[item['id']]['subjects'].append(to_append)
    return results

items = [
  {
    "subject_id": 1,
    "subject_name": "HR Sector 0",
    "id": 1,
    "name": "parent2",
    "value": 10.6
  },
  {
    "subject_id": 18,
    "subject_name": "Test11",
    "id": 1,
    "name": "parent2",
    "value": 12
  },
  {
    "subject_id": 2,
    "subject_name": "AG1",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 17
  },
  {
    "subject_id": 3,
    "subject_name": "Finance Group 2",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 1.5
  },
  {
    "subject_id": 10,
    "subject_name": "test",
    "id": 2,
    "name": "Customer Delivery Dpt. 1",
    "value": 10
  },
  {
    "subject_id": None,
    "subject_name": None,
    "id": 3,
    "name": "Technology Team 2",
    "value": None
  },
  {
    "subject_id": 8,
    "subject_name": "Group 4",
    "id": 5,
    "name": "Accounting Group 4",
    "value": 10
  },
  {
    "subject_id": None,
    "subject_name": None,
    "id": 9,
    "name": "PG2",
    "value": None
  }
]

result = process_items(items)


json.dumps(result.values()) # For python 3: json.dumps(list(results.values())) 

相关问题 更多 >