在Django中解析带有请求的JSON

时间:2016-04-14 08:30:28

标签: python json django

我正在使用django应用程序中的请求进行api调用。我一直在名字上得到一个关键错误。 json响应非常大,所以我只选择使用某些字段。但错误是在json列表中的第一项。

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 %}

为什么我收到密钥错误?

4 个答案:

答案 0 :(得分:3)

当你这样做时

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

您会收到一个包含一个密钥的字典cards

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

将其附加到jsonList是没有意义的,因为那样你就有了,

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

当您遍历该列表时,您将获得您开始使用的单个字典。正如我们之前所说,该字典只有一个密钥cards,因此当您尝试访问不存在的name密钥时,您会收到密钥错误。

您真的想要遍历[<list of cards>],因此请将jsonList设置为该列表。

    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) 

正如评论和其他答案中所述,您可以使用请求的json()方法来简化代码:

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

答案 1 :(得分:2)

因为在name字典中找不到密钥cards

要调试这个,你应该打印一张每张卡片dict,看看哪些dict是不规则的。

祝你好运!

答案 2 :(得分:2)

等等,你的json是

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

然后你加载它

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

它不会使jsonList

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

当您对其进行迭代时,您将获得{"cards": [{"name": "Air Elemental",...}]},并且显然它没有密钥name。您需要迭代jsonList['cards']

答案 3 :(得分:1)

如果您阅读了请求here的文档,jsonList = req.json()将分配与您从外部API资源接收的JSON相对应的字典/列表(并且可能比调用{{}更具可读性。 1}}。

我怀疑你收到的KeyError被抛到你的行json.loads(...),因为JSON解码过程没有按预期工作。

如果失败了,你有没有检查过你正在迭代正确的模板变量(cardData['name'] = cards['name']),因为这似乎是你传递给模板的。