使用模式将 python 字典编码为 JSON

Encoding python dictionary into JSON using a schema

我正在努力从 python 字典中编码 json。在字典上使用 json.dumps 时,无法告诉函数将字典键和值映射到哪些对象和属性。

盲目转储的结果是我最终得到了具有唯一键的无模式 json 而不是连贯的 json 结构

import json

d = {
 "Laptop": {
            "sony": 1,
            "apple": 2,
            "asus": 5,
          },
 "Camera": {
            "sony": 2,
            "sumsung": 1,
            "nikon" : 4,
           },
}
with open("my.json","w") as f:
    json.dump(d,f)

哪个returns

{"Laptop": {"sony": 1, "apple": 2, "asus": 5}, "Camera": {"sony": 2, "sumsung": 1, "nikon": 4}}

看起来像 json,但根本没有架构。

我希望生成一个更像这样的 json 文件

{"devices": [
  {"device": {
      "deviceType": "Laptop",
      "deviceBrands": [
         {"deviceBrand": {
            "deviceBrandName": "sony",
            "deviceBrandCount": "1"
            },
         {"deviceBrand": {
            "deviceBrandName": "apple",
            "deviceBrandCount": "2"
            },
         {"deviceBrand": {
            "deviceBrandName": "asus",
            "deviceBrandCount": "5"
            }
      },
  {"device": {
      "deviceType": "Camera",
      "deviceBrands": [
         {"deviceBrand": {
            "deviceBrandName": "sony",
            "deviceBrandCount": "2"
            },
         {"deviceBrand": {
            "deviceBrandName": "sumsung",
            "deviceBrandCount": "1"
            },
         {"deviceBrand": {
            "deviceBrandName": "nikon",
            "deviceBrandCount": "5"
            }
     }
}

有什么建议吗?

在调用 json.dump:

之前使用字典理解创建你想要的结构
output = {"devices": [
    {"device": {"deviceType": k, 
                "deviceBrands": [{"deviceBrand": {"deviceBrandName": k1, 
                                                  "deviceBrandCount": v1}
                                  } for k1, v1 in v.items()
                                 ]
                }
     } 
    for k,v in d.items()]}

with open("output.json","w") as f:
    json.dump(output,f)
output.json:
{
  "devices": [
    {
      "device": {
        "deviceType": "Laptop",
        "deviceBrands": [
          {
            "deviceBrand": {
              "deviceBrandName": "sony",
              "deviceBrandCount": 1
            }
          },
          {
            "deviceBrand": {
              "deviceBrandName": "apple",
              "deviceBrandCount": 2
            }
          },
          {
            "deviceBrand": {
              "deviceBrandName": "asus",
              "deviceBrandCount": 5
            }
          }
        ]
      }
    },
    {
      "device": {
        "deviceType": "Camera",
        "deviceBrands": [
          {
            "deviceBrand": {
              "deviceBrandName": "sony",
              "deviceBrandCount": 2
            }
          },
          {
            "deviceBrand": {
              "deviceBrandName": "sumsung",
              "deviceBrandCount": 1
            }
          },
          {
            "deviceBrand": {
              "deviceBrandName": "nikon",
              "deviceBrandCount": 4
            }
          }
        ]
      }
    }
  ]
}