首页 > 解决方案 > json python的递归解析

问题描述

这是我的json:

{

"articles": [
    {
      "Quality": "Super",
      
      "Quantity": 20,
      "factor": 0.2
  },
  {
    "Quality": "medium",
    "Quantity": 10,
    "factor": 0.3
  },
  {
    "Quality": "mix",
    "factor": 0.5,
    "articles": [
      {
        "Quality": "super",
        "Quantity": 50,
        "factor": 0.3
      },

      {
    "Quality": "medium",
    "Quantity": 30,
    "factor": 0.2
      }
   ]
  }
   ]
}

我需要这样计算结果:

[20 * 0.2*get_price() + 10 * 0.3*get_price() + 0.5 (50*0.3*get_price() + 30*0.2*get_price())] / sum(0.2+0.3+0.5*0.3 + 0.5*0.2)

这很棘手,我试着去做,但我想我错过了calculate()函数中的一些细节和MixPricer

get_price()是商品的价格,它是quality作为工厂实现的功能。

我尝试使用面向对象的方法来实现这一点:

class ArticleQual(metaclass=ABCMeta):

    PRICES = 0.0
    FACTORS = []

    def __init__(self, article):
        self.article = article

    @property
    def factor(self):
        if 'factor' in self.article:
            factor_ = self.article['factor']
        else:
            factor_ = 0.001 # default factor
        return factor_

    @abc.abstractmethod
    def get_price(self):
        pass

        raise ValueError("source type does not exist!")

class PriceFactory:

    def get_price_calculator(self, article):
        if article['Quality'] == 'super':
            return SuperPricer(article)
        elif article['Quality'] == 'medium':
            return MediumPricer(article)
        elif article['Quality'] == "mix":
            return MixPricer(article)
        else:
            raise ValueError("quality value does not exist!")


    class SuperPricer(ArticleQual):
          def __init__(self, article):
             super().__init__(article)
            
          def get_price(self):
              return self.factor * 100.0
    
    
    class MediumPricer(ArticleQual):
          def __init__(self, article):
             super().__init__(article)
             
          def get_price(self):
              return self.factor * 50.0
    
    class MixPricer(ArticleQual):
         def __init__(self, article):
             super().__init__(article)
             
         def get_price(self):
             return self.factor * calculate(self.article)

def calculate(data):
    if isinstance(data, dict):
        for k, v in data.items():
            if k == 'articles':
                if isinstance(v, list):
                    for art in v:
                        pricer = PriceFactory().get_price_calculator(article=art)

                        
                        ArticleQual.PRICES = ArticleQual.PRICES + pricer.get_price()

                        
                        ArticleQual.FACTORS.append(pricer.factor)

    return ArticleQual.PRICES

感谢试一试!

标签: pythonjsonrecursion

解决方案


推荐阅读