2016-04-14 8 views
1

私はdjangoアプリケーションでリクエストしてapi呼び出しを行っています。私は名前に重大な誤りがあり続けます。 jsonレスポンスはかなり大きいので、使用する特定のフィールドを選択するだけです。しかし、エラーはjsonリストの最初の項目にあります。リクエストでJSONを解析する(Djangoで)

JSONの最初の数行は、次のようになり、

"cards": [ 
    { 
     "name": "Air Elemental", 
     "manaCost": "{3}{U}{U}", 
     "cmc": 5, 
     "colors": [ 
     "Blue" 
     ], 
     "type": "Creature — Elemental", 
     "types": [ 
     "Creature" 
     ], 
     "subtypes": [ 
     "Elemental" 
     ], 

そして、私の見解で、私はこのようなJSONをパースしています、

def graphs(request): 
    if request.user.is_authenticated(): 
     parsedData = [] 
     req = requests.get('https://api.magicthegathering.io/v1/cards') 
     jsonList = [] 
     jsonList.append(json.loads(req.content.decode())) 
     cardData = {} 
     for cards in jsonList: 
      cardData['name'] = cards['name'] 
      cardData['manaCost'] = cards['manaCost'] 
      cardData['colors'] = cards['colors'] 
      cardData['type'] = cards['type'] 
      cardData['rarity'] = cards['rarity'] 
      cardData['set'] = cards['set'] 
      cardData['text'] = cards['text'] 
      cardData['flavor'] = cards['flavor'] 
      cardData['artist'] = cards['artist'] 
      cardData['power'] = cards['power'] 
      cardData['toughness'] = cards['toughness'] 
      cardData['layout'] = cards['layout'] 
      cardData['multiverseid'] = cards['multiverseid'] 
      cardData['id'] = cards['id'] 
     parsedData.append(cardData) 
     return render(request, 'graphs/graphs.html', {'data': parsedData}) 
    else: 
     return redirect('index') 

エラー

KeyError at /graphs/graphs/ 
'name' 

私の見解では、このようなデータにアクセスしています。

{% for key in cards %} 
         <tr> 
          <td>{{ key.name }}</td> 
          <td>{{ key.manaCost }}</td> 
          <td>{{ key.colors }}</td> 
          <td>{{ key.type }}</td> 
          <td>{{ key.rarity }}</td> 
          <td>{{ key.set }}</td> 
          <td>{{ key.text }}</td> 
          <td>{{ key.flavor }}</td> 
          <td>{{ key.artist }}</td> 
          <td>{{ key.power }}</td> 
          <td>{{ key.toughness }}</td> 
          <td>{{ key.layout }}</td> 
          <td>{{ key.multiverseid }}</td> 
          <td>{{ key.id }}</td> 
         </tr> 
        {% endfor %} 

キーエラーが表示されるのはなぜですか?

+1

が、使用できない[ 'req.json()'](HTTP ://docs.python-requests.org/en/master/user/quickstart/#json-response-content)を使用して、応答をJSONオブジェクトに直接変換します。 – AKS

答えて

3

あなたは

json.loads(req.content.decode()) 

を行うとあなたが一つのキー、cardsと辞書を取得します。

{'cards': [<list of cards>]} 

、あなたは、そのリストを

[{'cards': [<list of cards>]} 

とするときにループを持っているので、それは、jsonListにそれを追加しても意味がありません、あなたがして始めた、単一の辞書を取得します。前述のように、その辞書には単一のキーcardsがあるため、存在しないnameキーにアクセスしようとするとキーエラーが発生します。

[<list of cards>]を実際にループしたいので、代わりにjsonListをそのリストに設定してください。あなたのコードを簡素化するために、要求のjson()メソッドを使用することができ

コメントや他の回答で述べたように
req = requests.get('https://api.magicthegathering.io/v1/cards') 
    jsonData = json.loads(req.content.decode()) 
    jsonList = jsonData['cards'] 
    for cards in jsonList: 
     cardData = {} # move this line inside the loop 
     cardData['name'] = cards['name'] 
     ... 
     # make sure this line is inside the loop so that you append 
     # every card to parsedData 
     parsedData.append(cardData) 

、:

req = requests.get('https://api.magicthegathering.io/v1/cards') 
    jsonList = req.json()['cards'] 
    for cards in jsonList: 
     ... 
+0

テンプレートにも同じ方法でアクセスできますか?キー入力カード{{key.name}} またはカードの代わりにcardDataですか?私が作成した新しい辞書を反復しているからですか? – wuno

+0

'return render()'行では、 'data'というリストをテンプレートに渡しました。したがって、あなたは '{%%カードの%} {{card.name}} ... {%endfor%}'を実行することができます。 – Alasdair

+0

私は本当にこれを理解したいと思って申し訳ありません。 「データはどこで再生されますか」我々はca ;;カードデータ。しかし、私がデータを使うとき、最初の名前がレンダリングされます。データはテンプレートに組み込まれただけですか? – wuno

2

namecards dictにありません。

これをデバッグするには、各カードのdictの印刷を行い、どのdictが不規則であるかを確認する必要があります。

幸運を祈る!

+0

しかし、テンプレートではなくビュー上にエラーがあります。 – wuno

+0

cardData ['name'] = cards ['name'] – Snuggert

+0

カードの印刷を行い、名前が実際にそこにあるかどうかを確認します。 – Snuggert

2

待ち、あなたのJSONは

"cards": [ 
    {"name": "Air Elemental",...} 
] 

で次にあなたは、あなたがそれを反復すると、それはjsonList

[ 
    {"cards": [{"name": "Air Elemental",...}]} 
] 

ことはありません。この

jsonList = [] 
jsonList.append(json.loads(req.content.decode())) 

のようにそれをロード」 {"cards": [{"name": "Air Elemental",...}]}が得られ、明らかに鍵はnameではありません。 jsonList['cards']を反復処理する必要があります。

+0

ご協力ありがとうございます。私は3つの他のアプリでこれを行い、それは完全に働いた。デコードは、JSONオブジェクトがstrでなければならず、デコードを伴わない 'bytes'でなければなりません。あなたの提案の例をリストで表示してもらえますか?私はjsonの形式のために私が問題を抱えていると仮定します。これは他の3つのアプリケーションと同じではありません。 – wuno

+0

あなたの投稿から見ることができるのは@ laike9mです。これはデコードメソッドではなく、jsonオブジェクトです。 'cards'オブジェクトを表示して、それが何であるかを知りませんか? @wuno – zhangyangyu

+0

すべてのjsonダンプを(req.content)印刷します。私はあなたのすべての答えを見た後、とても混乱しています。私が書いた最後の3つのアプリを言ったように、私はこれを同じようにしました。あなたは私のコードで何が間違っているのかより具体的にしてください、あるいは私にこれを行うためのよりよい方法を教えてください。私はあなたに非常に感謝します。 – wuno

1

あなたが要求hereのドキュメントを読むと、jsonList = req.json()あなたは、外部APIリソースから受け取る(おそらくjson.loads(...)を呼び出すよりも読みやすいJSONに対応したdictsの辞書/リストを割り当てます。

私は疑うだろうあなたが期待するようJSONのデコード処理が機能していないので、あなたが受けているKeyError例外があなたのラインcardData['name'] = cards['name']でスローされていること。

はあなたが正しいテンプレート変数を反復していることをチェックして、それに失敗(for key in data)以来あなたが何を過ごしているかのようだテンプレートに荒い。

関連する問題