2016-09-20 123 views
-1

我想采用以下JSON并将其转换为多个字典,这样我就可以访问顶级节点下的每个设置,仅针对该环境。这是一个配置文件,可以维护不同环境的设置,我希望能够获取顶级节点/环境,然后使用所有仅用于该环境的底层节点/设置。如何使用Python将JSON转换为多个字典

我的例子JSON

{ “默认”:

{

"build": { 
    "projectKey": "TEST", 
    "buildKey": "ME" 
}, 
"headers": { 
    "json": "application/json", 
    "xml": "application/xml" 
} 

},

“开发”:{

"build": { 
    "projectKey": "TEST", 
    "buildKey": "YOU" 
}, 
"headers": { 
    "json": "application/json", 
    "xml": "application/xml" 
} 

},

“QA”:{

"build": { 
    "projectKey": "TEST", 
    "buildKey": "THEM" 
}, 
"headers": { 
    "json": "application/json", 
    "xml": "application/xml" 
} 

}}

我试图拉出顶级键这样做,但不能看到如何将它们分开成使用Python的多个字典,以便我可以收集每个环境的设置并使用它们而不会重复。通过检查节点的len来检查底层节点,看看下面是否有更多的节点,但是从顶层开始,将每个节点拆分为它自己的字典,我无法解决。

或者还有一种更好的方法可以做到这一点,而不是我不知道的。下面的长度可能会有所不同,但如果我可以分解这些,这应该是无关紧要的。

+0

“压扁成一个字典”的代码 - 你将不得不解释你实际上是什么意思。 – user2357112

+0

@ user2357112这是否使它更清晰?展平是我为此思考的一个术语,而不是JSON节点。不应该在这里使用它 – MichaelF

+0

不,它还是很不清楚。你认为“JSON节点”是什么,为什么你认为你还没有字典?这听起来像你已经有一个字典。那么,或者你有一个字符串,在这种情况下,你会使用'json.loads(your_string)'来解析它并得到一个字典,但是这听起来像你已经有一个字典。 – user2357112

回答

0

你的问题很混乱,但我会尝试一点点猜测,让我们假设你有一个json文件(我将模拟使用python3.x io.StringIO)。

我假设你想知道如何将该文件加载到python字典中,使用json.load方法来完成这项工作。这里是你展示如何使用不同的配置加载假设文件,然后再处理它MCVE例如:

import json 
import io 

f = io.StringIO("""{ 
    "default": { 
     "build": { 
      "projectKey": "TEST", 
      "buildKey": "ME" 
     }, 
     "headers": { 
      "json": "application/json", 
      "xml": "application/xml" 
     } 
    }, 
    "dev": { 
     "build": { 
      "projectKey": "TEST", 
      "buildKey": "YOU" 
     }, 
     "headers": { 
      "json": "application/json", 
        "xml": "application/xml" 
     } 
    }, 
    "qa": { 
     "build": { 
      "projectKey": "TEST", 
      "buildKey": "THEM" 
     }, 
     "headers": { 
      "json": "application/json", 
      "xml": "application/xml" 
     } 
    } 
}""") 


def processor(config, stage): 
    print('----Processing stuff for {0} server----'.format(stage)) 
    print(config[stage]) 
    print('----End----') 

config = json.load(f) 

for stage in ['default', 'dev', 'qa']: 
    processor(config, stage) 
0

将以上数据存储在下面的变量中,并使用json.loads将其转换为字典 它将文本转换为字典,然后可以基于env循环字典以获取属性

text=''' 
{ "default": 

{ 

"build": { 
    "projectKey": "TEST", 
    "buildKey": "ME" 
}, 
"headers": { 
    "json": "application/json", 
    "xml": "application/xml" 
} 

}, 

"dev": { 

"build": { 
    "projectKey": "TEST", 
    "buildKey": "YOU" 
}, 
"headers": { 
    "json": "application/json", 
    "xml": "application/xml" 
} 

}, 

"qa": { 

"build": { 
    "projectKey": "TEST", 
    "buildKey": "THEM" 
}, 
"headers": { 
    "json": "application/json", 
    "xml": "application/xml" 
} 

} }''' 
import json 
dict=json.loads(text) 
+0

这实际上非常接近我想要做的......谢谢 – MichaelF

0

您需要json.loads()stringjson对象转换。下面是打开文件并加载基于JSON的结构JSON作为dictlist(在你的情况dict

import json 
json_file = open('/path/to/config_file') 
json_str = json_file.read() 
json_data = json.loads(json_str)