2016-03-02 65 views
0

內容我有以下結構的JSON -解析JSON和印刷在控制檯

{ 
    "gridDefinition": {}, 
    "zoneDefinitions": [ 
     { 
      "status": "Pending", 
      "name": "xxx-1", 
      "globalName": "xxx-2", 
      "id": 10, 
      "memory": "1234", 
      "cores": "0", 
      "VM": [ 
       { 
        "ipAddress": "1.2.3.4", 
        "hostname": "zzzzz-1" 
       }, 
       { 
        "ipAddress": "2.3.4.5", 
        "type": "virtual" 
       } 
      ] 
     } 
    ] 
} 

我需要解析這和顯示在控制檯上,具有相同的結構,但沒有所有的「[]」和「{}」。

喜歡的東西:

gridDefinition: 
zoneDefinitions: 
    Status:Pending 
    name:xxx-1 
    id:10 
    memory:1234 
    cores:0 
    VM: 
     ipAddress : 1.2.3.4 
     hostname : zzzzz-1 

     ipAddress:2.3.4.5 
     ....... 
    ......... 
............. 

我試過pretty printing json

提到一對夫婦的遞歸解決方案,但這並沒有工作了。

可能有任何級別的數組和字典嵌套,我需要保留縮進並將它們打印在控制檯上。

任何人都可以指導我如何繼續這個?

+0

你可以只把JSON在字典中,遍歷它,並打印出你喜歡的方式 - 就像json.dumps一樣。 –

+0

如果你想把json的數據寫成沒有括號但有意義的空白的格式,可以嘗試用例如YAML輸出它。 [PyYAML](http://pyyaml.org/wiki/PyYAMLDocumentation)。 如果你真的只想要沒有括號的相同的結構ut,把它轉儲到一個字符串並搜索用空字符串替換括號 –

回答

0

決定與這futz各地,並與東西,將打印此想出了:

gridDefinition: 
zoneDefinitions: 
    status: Pending 
    name: xxx-1 
    globalName: xxx-2 
    id: 10 
    memory: 1234 
    cores: 0 
    VM: 
     ipAddress: 1.2.3.4 
     hostname: zzzzz-1 

     ipAddress: 2.3.4.5 
     type: virtual 

的腳本是:

import json 
import sys 
from collections import OrderedDict 

indent = ' ' 

def crawl(n, i): 
    s = '' 
    if isinstance(n, dict): 
    for (k,v) in n.items(): 
     if not isinstance(v, dict) and not isinstance(v, list): 
     s += '{}{}: {}\n'.format(i*indent, k, str(v)) 
     else: 
     s += '{}{}:\n{}'.format(i*indent, k, crawl(v, i+1)) 

    elif isinstance(n, list): 
    was_complex = False 
    for x in n: 
     if not isinstance(x, dict) and not isinstance(x, list): 
     s += '{}{}\n'.format(i*indent, str(x)) 
     else: 
     if was_complex: 
      s += '\n' 
     s += crawl(x, i+1) # or, to flatten lists-of-lists, do not pass +1 
     was_complex = isinstance(x, list) or isinstance(x, dict) 

    return s 

print crawl(json.load(sys.stdin, object_pairs_hook=OrderedDict), 0)