2012-03-19 27 views
1

dictを使ってjsonオブジェクトを作成していますが、dictとjsonに問題があります。私はループのための1つの受信されたいくつかの理由Python辞書json

def get(self): 

    players = db.GqlQuery("SELECT * FROM Player") 

    playerInfo = {} 



    for player in players: 
     email = player.email.encode("utf-8") 
     gem = str(player.gem) 

     print email 
     print gem 

     playerInfo["email"] = email 
     playerInfo["gem"] = gem 


    b = json.dumps(playerInfo) 

    self.response.out.write(b) 

、私はループのために電子メールを印刷するとき、私は検索結果を受け取ったが、playerInfoの出力は、データの1セットを有しています。

{"email": "test1", "gem": "0"} 

私の予想結果は、私は辞書のリストだと思う、あなたが望む何

{"email": "test1", "gem": "0"},{"email": "test2", "gem": "2"}... 
+2

あなたはリストを作成していません。あなたは各プレイヤーの辞書の値を上書きして、最後の値を出力しています。 – geoffspear

答えて

7

でなければなりません。これは、複数のエンティティを保存することができるようになります:

players = db.GqlQuery("SELECT * FROM Player") 

playerInfo = [] 

for player in players: 
    email = player.email.encode("utf-8") 
    gem = str(player.gem) 

    playerInfo.append({"email" :email, "gem": gem}) 

b = json.dumps(playerInfo) 

self.response.out.write(b) 

また、あなたが本当にあなたのAppEngineアプリケーションでprintを使用しないようにしたいです。 printは意図しない副作用を持つ可能性があるため、代わりにロギングを使用してください。

2

代わりにこれを試してください:あなたは辞書を何度も上書きされ

players = db.GqlQuery("SELECT * FROM Player") 

playerInfo = [] 

for player in players: 
    player_dict = dict(
     email = player.email.encode("utf-8") 
     gem = str(player.gem) 
    ) 

    playerInfo.append(player_dict) 

b = json.dumps(playerInfo) 

self.response.out.write(b) 
0

L = [] 
for player in players: 
    L.append('{"email": "%s", "gem": "%s"}' % (player.email.encode("utf-8"), str(player.gem)) 
b = ','.join(L) 

ごく少数のプレーヤー、ハイテクルートを行く::)の代わりにこれを試してみてください

players = db.GqlQuery("SELECT * FROM Player") 

player_list = [] 



for player in players: 
    email = player.email.encode("utf-8") 
    gem = str(player.gem) 

    print email 
    print gem 

    playerInfo = {} 

    playerInfo["email"] = email 
    playerInfo["gem"] = gem 
    player_list.append(playerInfo) 


b = json.dumps(player_list) 

self.response.out.write(b) 
0

は多分、可能な限り低いオーバーヘッドは出力がどのようにシンプル与えられた方がよいかもしれません。より多くのプレイヤーは、CPUサイクルについて考え、あなたのオーバーヘッドを下げます。上記の入力ミスをお許しください。 -stevep