

自分では間違っているところを見つけられませんが、なぜかエラーが出てしまいます。  
どなたかご教授ください。  
因みに、これは「クラッシュロワイヤル」というゲームのAPIを使っています。

[Clash Royale API](https://developer.clashroyale.com/)

エラーコードは以下になります。

[code]

    Traceback (most recent call last):
    File "C:\Users\mto\Desktop\python_lesson\CRL\crl_api.py", line 53, in <module>
    print(battle_info()[0]["type"])
    TypeError: string indices must be integers
    
[/code]

実際のコード

[code]

    import json
    import requests
    
    access_key = #ここでは省略しています
    
    URL = 'https://api.clashroyale.com/v1'
    
    def battle_info():
        target_api = URL + "/players/"
        playerTag = "%238QRCJQ9Y"
        url = target_api+playerTag+"/battlelog"
        headers = {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "max-age=60",
            "authorization": "Bearer  %s" % access_key}
        r = requests.get(url,headers=headers)
        data = r.json()
        result = json.dumps(data,indent=4) 
        return result
    
    print(battle_info()[0]["type"])
    
[/code]

また、以下のbattle_info()を出力すると以下のようになります。

[code]

    #実行コード
    print(battle_info())
    #実行結果
    [
        {
            "type": "challenge",
            "battleTime": "20190509T081821.000Z"
    
    　　　　#続きは省略
    
[/code]


CC BY-SA 4.0
2019-05-10T14:02:54.963
54875
2019-05-10T17:12:12.547
2019-05-10T17:12:12.547
3060
34254
question
python python3 json api
jsonを用いたAPIに関するコードを書きましたがエラーが発生します。


あなたの現在のコードでは、せっかくAPIで取得したレスポンスを`r.json()`でデコードしてpythonのList,
Dictionaryに変換したもの(`data`)を`dump`で文字列に変更してしまっています。

つまりこんなことをやっているのと同じことです。

[code]

    jsonText = '''\
    [
        {
            "type": "challenge",
            "battleTime": "20190509T081821.000Z"
            ...
    '''
    print(jsonText[0]["type"])
    
[/code]

`jsonText[0]`が最初の1文字`'['`を文字列として返しますので、その文字列に対して`["type"]`と言うインデックスを参照しようとしているので、
_TypeError: string indices must be integers_ なんてエラーになっています。

`battle_info()`の戻り値として`data`をそのまま返してみると良いでしょう。

[code]

    def battle_info():
        target_api = URL + "/players/"
        playerTag = "%238QRCJQ9Y"
        url = target_api+playerTag+"/battlelog"
        headers = {
            "content-type": "application/json; charset=utf-8",
            "cache-control": "max-age=60",
            "authorization": "Bearer  %s" % access_key}
        r = requests.get(url,headers=headers)
        data = r.json()
        return data
    
[/code]

お試しください。


CC BY-SA 4.0
2019-05-10T14:18:22.907
54876
2019-05-10T14:18:22.907
13972
54875
answer