2016-07-28 8 views
1

JSONの大きなファイルからスニペットであるJSONデータを次のビットにする必要があります。 私は基本的にはこのデータを展開することを検討しています。 後で既存のJSONファイルに追加することに心配します。PythonでJSONデータを生成する方法2.7 +

JSONデータの抜粋は以下のとおりです。

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

それでは、私がやりたいことは、「役割」のより多くのデータセットを作ることです(より良い用語の欠如のため)

したがって、このような何か:

"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 
    } 
    }, 

私はそうのように見えるいくつかのPythonコードで始めたが、私がかなり遠く的外れ

だそうです
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) 

私は辞書が名前付きインデックスを持つことができると思ったので、このエラーが発生しています。混乱しています。

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 

いずれかの考えがあります。ありがとう。右ここ

+1

RoleData ['Role'] 'は辞書ではなく、文字列です。前の行では 'RoleData ['Role'] = SingleRole'を設定し、' SingleRole'は文字列のリストを反復処理しています。 – larsks

答えて

1

RoleData['Role']=SingleRole 

あなたは、文字列 'STACiTS' であるとRoleDataを設定します。したがって、次のコマンドは次のように評価されます:

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

もちろん、別の文字列で文字列にインデックスを作成しようとしていますが、これはエラーです。辞書には名前付きインデックスを付けることができますが、作成した辞書は文字列で上書きしています。

あなたはおそらく[「役割」]その後、むしろRoleDataよりも、それに割り当てる辞書としてRoleData [「設定」]を作成するためのもの[「設定」]

はまた別のノートで、あなたは別の構文エラーを持っていますここをクリックしてください:

誤って「設定」が表示されると、後で同じ問題が修正されない限り発生します。

+0

ありがとうございました。私は何らかの構文エラーでなければならないことを知っていましたが、私がしようとしていたことの良い例を見つけるのは難しかったです。 – jthompson333

+0

うれしい私は助けることができました!それがあなたを助けた場合、答えを受け入れる気にならないなら、それは素晴らしいでしょう! – James

関連する問題