[英]Print unique JSON keys in dot notation using Python
我正在嘗試編寫一個腳本,以點表示法打印JSON文件的唯一鍵,以便快速分析結構。
例如,假設我的'myfile.json'具有以下格式:
{
"a": "one",
"b": "two",
"c": {
"d": "four",
"e": "five",
"f": [
{
"x": "six",
"y": "seven"
},
{
"x": "eight",
"y": "nine"
}
]
}
運行以下命令將生成一組唯一的鍵,但它缺少譜系。
import json
json_data = open("myfile.json")
jdata = json.load(json_data)
def get_keys(dl, keys_list):
if isinstance(dl, dict):
keys_list += dl.keys()
map(lambda x: get_keys(x, keys_list), dl.values())
elif isinstance(dl, list):
map(lambda x: get_keys(x, keys_list), dl)
keys = []
get_keys(jdata, keys)
all_keys = list(set(keys))
print '\n'.join([str(x) for x in sorted(all_keys)])
以下輸出不表示'x','y'嵌套在'f'數組中。
a
b
c
d
e
f
x
y
我無法弄清楚如何遍歷嵌套結構以附加父鍵。
理想的輸出是:
a
b
c.d
c.e
c.f.x
c.f.y
我建議使用遞歸生成器函數,使用yield語句而不是在內部構建列表。 在Python 2.6+中,以下工作原理:
import json
json_data = json.load(open("myfile.json"))
def walk_keys(obj, path=""):
if isinstance(obj, dict):
for k, v in obj.iteritems():
for r in walk_keys(v, path + "." + k if path else k):
yield r
elif isinstance(obj, list):
for i, v in enumerate(obj):
s = "[" + str(i) + "]"
for r in walk_keys(v, path + s if path else s):
yield r
else:
yield path
for s in sorted(walk_keys(json_data)):
print s
在Python 3.x中,您可以使用yield作為語法糖進行遞歸生成,如下所示:
import json
json_data = json.load(open("myfile.json"))
def walk_keys(obj, path=""):
if isinstance(obj, dict):
for k, v in obj.items():
yield from walk_keys(v, path + "." + k if path else k)
elif isinstance(obj, list):
for i, v in enumerate(obj):
s = "[" + str(i) + "]"
yield from walk_keys(v, path + s if path else s)
else:
yield path
for s in sorted(walk_keys(json_data)):
print(s)
根據MTADD的指導,我將以下內容放在一起:
import json
json_file_path = "myfile.json"
json_data = json.load(open(json_file_path))
def walk_keys(obj, path = ""):
if isinstance(obj, dict):
for k, v in obj.iteritems():
for r in walk_keys(v, path + "." + k if path else k):
yield r
elif isinstance(obj, list):
for i, v in enumerate(obj):
s = ""
for r in walk_keys(v, path if path else s):
yield r
else:
yield path
all_keys = list(set(walk_keys(json_data)))
print '\n'.join([str(x) for x in sorted(all_keys)])
結果符合預期
a
b
c.d
c.e
c.f.x
c.f.y
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.