2016-03-02 1 views
0

J'ai un JSON avec la structure suivante -Parsing JSON et imprimer le contenu sur la console

{ 
    "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" 
       } 
      ] 
     } 
    ] 
} 

je dois analyser cela et affichage sur la console, avec la même structure, mais sans tous les « [] » et "{}" .

Quelque chose comme:

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 
     ....... 
    ......... 
............. 

J'ai essayé quelques solutions récursives mentionné sur pretty printing json

Mais cela ne fonctionne pas.

Il peut y avoir des niveaux d'imbrication de tableaux et de dictionnaires, j'ai besoin de préserver l'indentation et de les imprimer sur la console.

Quelqu'un pourrait-il me guider sur la façon de procéder?

+0

Vous pouvez tout simplement mettre le JSON dans un dictionnaire, itérer sur et imprimez-le comme vous le souhaitez - tout comme json.dumps. –

+0

Si vous souhaitez écrire des données json like dans un format sans parenthèses mais avec des espaces blancs significatifs, essayez de les sortir en YAML avec, par exemple, [PyYAML] (http://pyyaml.org/wiki/PyYAMLDocumentation). Si vous voulez vraiment la même structure sans les parenthèses, jetez-la dans une chaîne et recherchez les parenthèses vides –

Répondre

0

Décidé à futz autour de cela, et est venu avec quelque chose qui va imprimer:

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 

Le script est:

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)