首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python列表到嵌套Json

Python列表到嵌套Json
EN

Stack Overflow用户
提问于 2020-01-24 22:30:11
回答 2查看 93关注 0票数 0

我有以下问题。

代码语言:javascript
复制
class Inventory:
    def __init__(self,project_no,country,category,product,count):
        self.project_no = project_no
        self.country = country
        self.category = category
        self.product = product
        self.count = count
inventory_list = []
inventory_list.append(Inventory(1,'USA','Beverages','Milk',2))
inventory_list.append(Inventory(1,'USA','Beverages','Juice',5))
inventory_list.append(Inventory(1,'USA','Snacks','Potato Chips',2))
inventory_list.append(Inventory(1,'USA','Oils','Canola',5))
inventory_list.append(Inventory(1,'USA','Oils','Olive',8))
inventory_list.append(Inventory(1,'CAN','Beverages','Milk',7))
inventory_list.append(Inventory(1,'CAN','Beverages','Juice',8))
inventory_list.append(Inventory(1,'CAN','Snacks','Potato Chips',8))
inventory_list.append(Inventory(1,'CAN','Oils','Canola',3))
inventory_list.append(Inventory(1,'CAN','Oils','Olive',4))

{'Inventory': [{'Country': inv.country , 'Category' : [{inv.category : [{'Product' : inv.product}]}] }  for inv in inventory_list]}

这段代码提供了以下输出。

{“库存”:[{“国家”:“美国”,“类别”:[{“饮料”:{“产品”:“牛奶”},{“国家”:“美国”,“类别”:{“饮料”:{“产品”:“果汁”},{“国家”:“美国”,“类别”:“小吃”:“零食”:“产品”:“薯片”}{“国家”:“美国”,“类别”:[{“油”:{‘产品’:‘菜籽油’},{“国家”:‘美国’,‘类别’:[{‘油’:{‘产品’:‘橄榄树’}{‘国家’:'CAN',‘类别’:[{‘饮料’:{‘产品’:‘牛奶}{’国家‘:'CAN',}‘类别’:{‘饮料’:{‘产品’:‘果汁’},{‘国家’:'CAN',‘类别’:[{‘小吃’:{‘产品’:‘薯片’}{‘国家’:'CAN',‘类别’:{‘油’:{‘产品’:‘菜花’},{‘国家’:'CAN',“类别”:[{‘油’:{‘产品’:‘橄榄’}}]}}

我真正需要的更像是下面。

{“库存”:[{“国家”:“美国”,“类别”:[“饮料”:{“产品”:“牛奶”,“计数”:2 },{“产品”:“果汁”,“计数”:5 },{“零食”:{“产品”:“马铃薯片”,“计数”:2 },{“油”:{“产品”:“油菜”,“计数”:5 },{“产品”:“橄榄”,“计数”:8 },{“国家”:“可以”,“类别”:[“饮料”:{“产品”:“牛奶”,“计数”:7 },{“产品”:“果汁”,“计数”:8 },{“零食”:{“产品”:“马铃薯片”,“计数”:8 },{“油”:{“产品”:“油菜籽”,“计数”:3 },{“产品”:“橄榄”,“计数”:4}

怎么做?我认为理解列表是最好的方法。但我在这点上遇到了麻烦。我认为对于python编码器来说,这应该是非常容易的。用我有限的蟒蛇,我只能走这么远。如果有人能帮忙的话。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-24 23:38:10

我建议您尝试使用模块序列化您的类。但是,看起来您需要对数据进行一些重新组织。据我所知,您希望有一个inventory,它包含一个countries集合,其中包含一组将products划分为的产品。

首先,让我们定义产品类:

代码语言:javascript
复制
class Product(object):
    def __init__(self, name, count):
        self.product = name
        self.count = count

接下来,我们可以将Country类定义为集合Products的容器,该容器在字典中使用类别名称作为键。

代码语言:javascript
复制
class Country(object):
    def __init__(self, name):
        self.name = name
        self.categories = dict()

    def add_product_to_category(self, category, product):
        if category not in self.categories:
            self.categories[category] = []
        self.categories[category].append(product)

然后,我们可以将库存类重新定义为一组Country对象的容器。

代码语言:javascript
复制
class Inventory(object):
    def __init__(self, project_no):
        self.project_no = project_no
        self.countries = []

接下来,我们可以使用简单的方法来用所需的数据填充类。

代码语言:javascript
复制
inv = Inventory(1)

us_set = Country('USA')
us_set.add_product_to_category('Beverages', Product('Milk', 2))
us_set.add_product_to_category('Beverages', Product('Juice', 5))
us_set.add_product_to_category('Snacks', Product('Potato Chips', 2))
us_set.add_product_to_category('Oils', Product('Canola', 5))
us_set.add_product_to_category('Oils', Product('Olive', 8))

canada_set = Country('CAN')
canada_set.add_product_to_category('Beverages', Product('Milk', 7))
canada_set.add_product_to_category('Beverages', Product('Juice', 8))
canada_set.add_product_to_category('Snacks', Product('Potato Chips', 8))
canada_set.add_product_to_category('Oils', Product('Canola', 3))
canada_set.add_product_to_category('Oils', Product('Olive', 4))

inv.countries.append(us_set)
inv.countries.append(canada_set)

最后,(实际回答您的问题,lul)要序列化Inventory类,我们必须定义一个编码器来使用:

代码语言:javascript
复制
class MyEncoder(json.JSONEncoder):
    def default(self, o):
        return o.__dict__

现在,我们只需调用json.dumps()来获取序列化的Inventory的字符串输出。

代码语言:javascript
复制
json.dumps(inv, indent=2, cls=MyEncoder)

输出不完全是你布置的,但我认为这个方法对你很有用。

代码语言:javascript
复制
{
  "project_no": 1, 
  "countries": [
    {
      "name": "USA", 
      "categories": {
        "Beverages": [
          {
            "count": 2, 
            "product": "Milk"
          }, 
          {
            "count": 5, 
            "product": "Juice"
          }
        ], 
        "Oils": [
          {
            "count": 5, 
            "product": "Canola"
          }, 
          {
            "count": 8, 
            "product": "Olive"
          }
        ], 
        "Snacks": [
          {
            "count": 2, 
            "product": "Potato Chips"
          }
        ]
      }
    }, 
    {
      "name": "CAN", 
      "categories": {
        "Beverages": [
          {
            "count": 7, 
            "product": "Milk"
          }, 
          {
            "count": 8, 
            "product": "Juice"
          }
        ], 
        "Oils": [
          {
            "count": 3, 
            "product": "Canola"
          }, 
          {
            "count": 4, 
            "product": "Olive"
          }
        ], 
        "Snacks": [
          {
            "count": 8, 
            "product": "Potato Chips"
          }
        ]
      }
    }
  ]
}
票数 2
EN

Stack Overflow用户

发布于 2020-01-24 23:10:24

尝试使用json模块。

代码语言:javascript
复制
import json
...
inv_json = {'Inventory': [{'Country': inv.country , 'Category' : [{inv.category : [{'Product' : inv.product}]}] }  for inv in inventory_list]}
json_formatted_str = json.dumps(x, indent=2)
print(json_formatted_str)

https://www.journaldev.com/33302/python-pretty-print-json

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59904507

复制
相关文章

相似问题

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