微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RIOTAPI的JSON格式错误

如何解决RIOTAPI的JSON格式错误

我正在从API将JSON数据导入Python,并遇到以下解码错误

JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

看看在线示例,它会立即清除我的JSON数据具有',其他人具有"

理想情况下,我想知道为什么以这种方式下载它。看来这很可能是我的错误,而不是他们的错误

我认为改正JSON格式应该很容易,但是我在这里也失败了。请参阅下面的代码,了解如何获取JSON数据以及如何修复它。

#----------------------------------------
#---Read this only if you want to download 
#---the data yourself. 
#----------------------------------------

#Built from 'Towards Data Science' guide
#https://towardsdatascience.com/how-to-use-riot-api-with-python-b93be82dbbd6

#Must first have installed riotwatcher

#Info in my example is made up,I can't supply a real API code or
#I get in trouble. Sorry about this. You Could obtain one from their website
#but this would be a lot of faff for what is probably a simple StackOverflow
#question

#If you were to get/have a key you Could use the following information:
#<EUW> for region
#<Agurin> for name

#----------------------------------------
#---Code
#----------------------------------------


#--->Set Variables


#Get installed riotwatcher module for
#Python
import riotwatcher

#Import riotwatcher tools.
from riotwatcher import LolWatcher,ApiError

#Import JSON (to read the JSON API file)
import json

# Global variables
# Get new API from
# https://developer.riotgames.com/
api_key = 'RGAPI-XXXXXXX-XXX-XXXX-XXXX-XXXX'
watcher = LolWatcher(api_key)
my_region = 'MiddleEarth'

#need to give path to where records
#are to be stored
records_dir = "/home/solebaysharp/Projects/Riot API/Records"


#--->Obtain initial data,setup new varaibles

#Use 'watcher' to get basic stats and setup my account as a variable (me)
me = watcher.summoner.by_name(my_region,"SolebaySharp")

# Setup retrieval of recent match info
my_matches = watcher.match.matchlist_by_account(my_region,me["accountId"])
print(my_matches)

#--->Download the recent match data

#Define where the JSON data is going to go
recent_matches_index_json = (records_dir + "/recent_matches_index.json")

#get that JSON data
print ("Downloading recent match history data")
file_handle = open(recent_matches_index_json,"w+")
file_handle.write(str(my_matches))
file_handle.close()

#convert it to python
file_handle = open(recent_matches_index_json,)
recent_matches_index = json.load(file_handle)

除了这个给予者以下错误...

JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

所以我改正了这个问题:

file_handle = open(recent_matches_index_json)

json_sanitised = json.loads(file_handle.replace("'",'"'))

这将返回...

AttributeError: '_io.TextIOWrapper' object has no attribute 'replace'

为了完整起见,下面是JSON外观的示例。我添加了段落以增强可读性。不是这样的。

{'matches': [
  {'platformId': 'NA1','gameId': 5687555181,'champion': 235,'queue': 400,'season': 13,'timestamp': 1598243995076,'role': 'DUO_SUPPORT','lane': 'BottOM'
   },{'platformId': 'NA1','gameId': 4965733458,'timestamp': 1598240780841,'gameId': 4583215645,'champion': 111,'timestamp': 1598236666162,'lane': 'BottOM'
   }],'startIndex': 0,'endindex': 100,'totalGames': 186}

解决方法

之所以发生这种情况,是因为Python将JSON转换为字符串(str)。

file_handle.write(str(my_matches))

由于没有看到'"之间的区别,它只是使用了默认的'

我们可以使用JSON.dumps阻止这种情况的发生。由于我们使用的是正确格式的JSON命令,因此部分(肯定不是完全)也可以回答问题的第二部分。

上述行仅需替换为:

file_handle.write(json.dumps(my_matches))

这将保留JSON格式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。