2016-09-20 124 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)