转换嵌套的JSON转换成Python对象

转换嵌套的JSON转换成Python对象

问题描述:

我有嵌套的JSON如下转换嵌套的JSON转换成Python对象

{ 
"product" : "name", 
"protocol" : "scp", 
"read_logs" : { 
    "log_type" : "failure", 
    "log_url" : "htttp:url" 
    } 
} 

我想创建Python类对象与下面的代码。

import json 
class Config (object): 
    """ 
    Argument: JSON Object from the configuration file. 
    """ 
    def __init__(self, attrs): 
     if 'log_type' in attrs: 
      self.log_type = attrs['log_type'] 
      self.log_url = attrs['log_url'] 
     else: 
      self.product = attrs["product"] 
      self.protocol = attrs["protocol"] 
    def __str__(self): 
     return "%s;%s" %(self.product, self.log_type) 

    def get_product(self): 
     return self.product 

    def get_logurl(self): 
     return self.log_url 

class ConfigLoader (object): 
    ''' 
     Create a confiuration loaded which can read JSON config files 
    ''' 
    def load_config (self, attrs): 
     with open (attrs) as data_file: 
      config = json.load(data_file, object_hook=load_json) 
     return config 

def load_json (json_object): 
    return Config (json_object) 

loader = ConfigLoader() 
config = loader.load_config('../config/product_config.json') 

print config.get_protocol() 

但是,在object_hook递归调用load_json和类配置初始化被称为两次。所以我创建的最终对象不包含嵌套的JSON数据。

有什么方法可以将整个嵌套的JSON对象读入一个Python类吗?

感谢

上的Pankaj阿密特的理念的变化,但使用“通用”的命名空间类,而不是namedtuples的:

import json 

class Generic: 
    @classmethod 
    def from_dict(cls, dict): 
     obj = cls() 
     obj.__dict__.update(dict) 
     return obj 

data = '{"product": "name", "read_logs": {"log_type": "failure", "log_url": "123"}}' 

x = json.loads(data, object_hook=Generic.from_dict) 
print(x.product, x.read_logs.log_type, x.read_logs.log_url) 

namedtuple & object_hook可以帮助创建一个班轮:

# Create an object with attributes corresponding to JSON keys. 
def json_to_obj(data): return json.loads(data, object_hook=lambda converted_dict: namedtuple('X', converted_dict.keys())(*converted_dict.values())) 

,或者创建一个更可读的功能象下面这样:

def _object_hook(converted_dict): return namedtuple('X', converted_dict.keys())(*converted_dict.values()) 
def json_to_obj(data): return json.loads(data, object_hook=_object_hook) 

下面的代码片段使用它:

import json 
from collections import namedtuple 

data = '{"product": "name", "read_logs": {"log_type": "failure", "log_url": htttp:url}}' 

x = json_to_obj(data) 
print x.product, x.read_logs.log_type, x.read_logs.log_url 

注:退房namedtuplerename parameter

+0

使用namedtuples不是语义上最好的选择,更不用说创造新的'namedtuple's相当由于课堂创作而缓慢。 – AKX