我有这段代码将URL中的JSON数据发送到MySQL数据库,但是出现错误“字符串索引必须是整数”
import urllib.parse
import requests
import pymysql
mydb = pymysql.connect(host='127.0.0.1', user='test', passwd='test', db='test', local_infile=1)
r = requests.get('https://example.com/apidata')
cursor = mydb.cursor()
json_obj = r.json()
for ord in json_obj["0"]:
print("stripe_token", ord["stripe_token"])
cursor.execute("INSERT INTO apidata (stripe_token) VALUES (%s)", (ord["stripe_token"]))
#close the connection to the database.
mydb.commit()
cursor.close()
我的Json数据看起来像这样
{
"0": {
"need_session_refresh": "1",
"signup_email_sent": "1",
"stripe_cc_expires": "0000",
"stripe_cc_masked": "123456",
"stripe_token": "1x734g834",
我在做什么错了?
谢谢:)
编辑-我也想以递归方式解析此内容,例如
{
"0": {
"stripe_token": "756474745",
"need_session_refresh": "1",
},
"1": {
"nstripe_token": "34563456",
"need_session_refresh": "1",
},
"_total": 43054
}
答案 0 :(得分:1)
问题在于,当您遍历这样的字典时:
for ord in json_obj["0"]:
ord
实际上会获取字典中所有键的值,而不是键值对。这就是说,当您这样做时:
ord["stripe_token"]
ord
是字典中的键(即字符串),它抱怨您不能使用另一个字符串将其索引为一个字符串。
我认为问题是您假设“ 0”内的结构是列表而不是字典。如果您执行json_obj["0"]["stripe_token"]
,则应该发现您获得了想要的值。您还可以删除循环for ord in json_obj["0"]:
,因为实际上json_obj["0"]
中没有列表。
代码将如下所示:
json_obj = r.json()
ord = json_obj["0"]
print("stripe_token", ord["stripe_token"])
cursor.execute("INSERT INTO apidata (stripe_token) VALUES (%s)", (ord["stripe_token"]))
编辑:正如您所添加的,json_values
中还有其他需要访问的键,您将需要遍历这些键。代码如下:
for index in json_obj:
if index != "_total":
cursor.execute("INSERT INTO apidata (stripe_token) VALUES (%s)", (json_obj[index]["stripe_token"]))
答案 1 :(得分:0)
for ord in json_obj["0"]:
print("stripe_token", ord["stripe_token"])
这里ord
将遍历json_obj["0"]
的键。您根本不需要循环
print(f"stripe_token: {json_obj['0']['stripe_token']}")
仅当您的json_obj
具有多个元素时,才需要循环。
我建议当json对象看起来不符合您的期望时正确处理这种情况。