2015-11-03 44 views
3

我正在尝试编写一个脚本,以点表示形式打印JSON文件的唯一键以便快速剖析结构。使用Python在点表示法中打印独特的JSON键

例如,让我们说我有“myfile.json”具有以下格式:

{ 
"a": "one", 
"b": "two", 
"c": { 
    "d": "four", 
    "e": "five", 
    "f": [ 
     { 
      "x": "six", 
      "y": "seven" 
     }, 
     { 
      "x": "eight", 
      "y": "nine" 
     } 
    ] 
} 

运行下面会产生独特的一套钥匙,但它缺少的血统。以下输出不表示'x','y'嵌套在'f'数组中。

a 
b 
c 
d 
e 
f 
x 
y 

我想不出如何遍历嵌套结构来追加父键。

理想的输出将是:

a 
b 
c.d 
c.e 
c.f.x 
c.f.y 
+0

你已经在'get_keys'中对字典做了很好的遍历,为什么不在函数内部打印呢? –

回答

0

我建议使用递归生成功能,采用产量语句,而不是在内部建立一个列表。在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中,你可以使用收益率从为递归生成语法糖,具体如下:

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) 
+0

这工作出色! – T3X45

0

抽出的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