将JSON数据从URL解析到MySQL

时间:2019-09-16 10:56:53

标签: python json

我有这段代码将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
}

2 个答案:

答案 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对象看起来不符合您的期望时正确处理这种情况。