2016-07-28 10 views
1

Ich habe folgende Bit von JSON-Daten, die ein Schnipsel aus einer großen Datei von JSON ist. Ich bin im Grunde nur um diese Daten zu erweitern. Ich mache mir Sorgen, dass ich es später zur vorhandenen JSON-Datei hinzufügen kann.Wie generiere ich JSON-Daten mit Python 2.7+

Die JSON-Daten-Schnipsel ist:

"Roles": [ 
    { 
    "Role": "STACiWS_B", 
    "Settings": { 
     "HostType": "AsfManaged", 
     "Hostname": "JTTstSTBWS-0001", 
     "TemplateName": "W2K16_BETA_4CPU", 
     "Hypervisor": "sys2Director-pool4", 
     "InCloud": false 
    } 
    } 
], 

Also, was ich will viele weitere Datensätze der „Rolle“ zu machen, zu tun ist (mangels eines besseren Begriffs)

So etwas wie folgt aus:

"Roles": [ 
    { 
    "Role": "Clients", 
    "Settings": { 
     "HostType": "AsfManaged", 
     "Hostname": "JTClients-0001", 
     "TemplateName": "Win10_RTM_64_EN_1511", 
     "Hypervisor": "sys2director-pool3", 
     "InCloud": false 
    } 
    }, 
    { 
    "Role": "Clients", 
    "Settings": { 
     "HostType": "AsfManaged", 
     "Hostname": "JTClients-0002", 
     "TemplateName": "Win10_RTM_64_EN_1511", 
     "Hypervisor": "sys2director-pool3", 
     "InCloud": false 
    } 
    }, 

ich mit einigem python-Code gestartet, der wie so aussieht, aber es scheint, dass ich weg von der Markierung ziemlich weit bin

import json 
    import pprint 

Roles = ["STACiTS","STACiWS","STACiWS_B"] 
RoleData = dict() 
RoleData['Role'] = dict() 
RoleData['Role']['Setttings'] = dict() 
ASFHostType = "AsfManaged" 
ASFBaseHostname = ["JTSTACiTS","JTSTACiWS","JTSTACiWS_"] 
HypTemplateName = "W2K12R2_4CPU" 
HypPoolName = "sys2director" 

def CreateASF_Roles(Roles): 
    for SingleRole in Roles: 
     print SingleRole #debug purposes 
     if SingleRole == 'STACiTS': 
      print ("We found STACiTS!!!") #debug purposes 
      NumOfHosts = 1 
      for NumOfHosts in range(20): #Hardcoded for STACiTS - Generate 20 STACiTS datasets 
       RoleData['Role']=SingleRole 
       RoleData['Role']['Settings']['HostType']=ASFHostType 
       ASFHostname = ASFBaseHostname + '-' + NumOfHosts.zfill(4) 
       RoleData['Role']['Settings']['Hostname']=ASFHostname 
       RoleData['Role']['Settings']['TemplateName']=HypTemplateName 
       RoleData['Role']['Settings']['Hypervisor']=HypPoolName 
       RoleData['Role']['Settings']['InCloud']="false" 


CreateASF_Roles(Roles)    

pprint.pprint(RoleData) 

Ich bekomme diesen Fehler, der verwirrend ist, weil ich dachte, Wörterbücher könnten benannte Indizes haben.

Traceback (most recent call last): 
    File ".\CreateASFRoles.py", line 34, in <module> 
    CreateASF_Roles(Roles) 
    File ".\CreateASFRoles.py", line 26, in CreateASF_Roles 
    RoleData['Role']['Settings']['HostType']=ASFHostType 
TypeError: string indices must be integers, not str 

Alle Gedanken sind willkommen. Vielen Dank.

+1

'RoleData ['Role']' ist kein Wörterbuch, es ist eine Zeichenkette. Weil Sie in der vorhergehenden Zeile 'RoleData ['Role'] = SingleRole' gesetzt haben und' SingleRole' über eine Liste von Strings iteriert. – larsks

Antwort

1

Genau hier:

RoleData['Role']=SingleRole 

Sie setzen RoleData die Zeichenfolge 'STACiTS' zu sein. So wird der nächste Befehl ausgewertet:

'STACiTS'['Settings']['HostType']=ASFHostType 

was natürlich mit einem anderen String-Index in einen String versucht, die Ihre Fehler. Wörterbücher können benannte Indizes haben, aber Sie haben das von Ihnen erstellte Wörterbuch mit einer Zeichenfolge überschrieben.

Sie wahrscheinlich gedacht RoleData [ „Einstellungen“] zu erstellen, wie ein Wörterbuch dann zu, dass zuweisen, anstatt RoleData [ „Rolle“] [ „Einstellungen“]

Auch auf einer anderen Anmerkung, haben Sie eine anderen Syntaxfehler hier oben:

Mit einem Fehlbuchstabieren von "Einstellungen", die wahrscheinlich später ähnliche Probleme für Sie verursachen werden, wenn nicht behoben.

+0

Ok danke. Ich wusste, dass es ein Syntaxfehler sein musste, aber ich hatte Probleme, gute Beispiele für das zu finden, was ich versuchte. – jthompson333

+0

Ich bin froh, dass ich helfen konnte! Wenn es dir nichts ausmacht, die Antwort zu akzeptieren, wenn es dir hilft, wäre das großartig! – James