1

我想按键读取数据,但下面的错误是有问题的

    print(data[0]['user_id'])
TypeError: string indices must be integers

我的代码:

with open("AccInformation.json") as file:
    data = json.loads(file.read())
    print(data[0]['user_id'])

我的示例 json 文件:

[
    "{\"user_id\": 88387467586, \"firstName\": \"Murat\", \"lastName\": \"KO\\u00c7\", \"email\": \"vehbikoc@kocholding.com.tr\", \"username\": \"kocholding\", \"password\": \"123456789\", \"accountKEY\": \"Y29K-G6LF-MRDI-PT5S-BZ1Q-VA4N\", \"register_date\": \"Mon Aug 30 02:01:31 2021\"}",
    "{\"user_id\": 33233303603, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"ZW2G-7960-HPQA-5SKX-LTDJ-YBCE\", \"register_date\": \"Mon Aug 30 14:42:39 2021\"}",
    "{\"user_id\": 86519529854, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"79DG-BNAZ-4IV3-OCKE-H5PM-UJ0T\", \"register_date\": \"Mon Aug 30 15:42:37 2021\"}",
    "{\"user_id\": 51814237688, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"SLVG-F2C6-0QOB-5UJ1-AIHZ-78X4\", \"register_date\": \"Mon Aug 30 22:46:48 2021\"}"
]

我在哪里做错了?

4

4 回答 4

3

您在这里拥有的是一个带有字符串列表的 json。您需要再次解析它们中的每一个或修复您的 json。

with open("AccInformation.json") as file:
   data = json.load(file)
   print(json.loads(data[0])['user_id'])

甚至更好:

with open() as file:
   data = [json.loads(it) for it in json.load(file)]
   print(data[0]['user_id'])

[] 语法称为列表推导。Alltough我建议你修复你的json

于 2021-08-31T07:59:16.133 回答
1

您的 json 文件格式错误,您能否删除地图周围的“”,并删除在地图键中转义“”的 \,以便代替:

[
    "{\"user_id\": 88387467586, \"firstName\": \"Murat\", \"lastName\": \"KO\\u00c7\", \"email\": \"vehbikoc@kocholding.com.tr\", \"username\": \"kocholding\", \"password\": \"123456789\", \"accountKEY\": \"Y29K-G6LF-MRDI-PT5S-BZ1Q-VA4N\", \"register_date\": \"Mon Aug 30 02:01:31 2021\"}",
    "{\"user_id\": 33233303603, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"ZW2G-7960-HPQA-5SKX-LTDJ-YBCE\", \"register_date\": \"Mon Aug 30 14:42:39 2021\"}",
    "{\"user_id\": 86519529854, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"79DG-BNAZ-4IV3-OCKE-H5PM-UJ0T\", \"register_date\": \"Mon Aug 30 15:42:37 2021\"}",
    "{\"user_id\": 51814237688, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"SLVG-F2C6-0QOB-5UJ1-AIHZ-78X4\", \"register_date\": \"Mon Aug 30 22:46:48 2021\"}"
]

应该

[
    {"user_id": 88387467586, "firstName": "Murat", "lastName": "KOu00c7", "email": "vehbikoc@kocholding.com.tr", "username": "kocholding", "password": "123456789", "accountKEY": "Y29K-G6LF-MRDI-PT5S-BZ1Q-VA4N", "register_date": "Mon Aug 30 02:01:31 2021"},
    {"user_id": 33233303603, "firstName": "Sema", "lastName": "UZUN", "email": "sema12@gmail.com", "username": "semazen", "password": "123456789", "accountKEY": "ZW2G-7960-HPQA-5SKX-LTDJ-YBCE", "register_date": "Mon Aug 30 14:42:39 2021"},
    {"user_id": 86519529854, "firstName": "Sema", "lastName": "UZUN", "email": "sema12@gmail.com", "username": "semazen", "password": "123456789", "accountKEY": "79DG-BNAZ-4IV3-OCKE-H5PM-UJ0T", "register_date": "Mon Aug 30 15:42:37 2021"},
    {"user_id": 51814237688, "firstName": "Sema", "lastName": "UZUN", "email": "sema12@gmail.com", "username": "semazen", "password": "123456789", "accountKEY": "SLVG-F2C6-0QOB-5UJ1-AIHZ-78X4", "register_date": "Mon Aug 30 22:46:48 2021"}
]

然后它将正常工作,您可以按如下方式访问您的数据:

data[0]["user_id" or indeed data[0].user_id
于 2021-08-31T08:13:49.320 回答
1

问题是您的AccInformation.json文件中有一个字符串列表,并且您试图访问user_id字符串的键,这是不可能的,因为字符串具有整数作为索引。您需要做的是json.loads(data[0])首先将字符串反序列化为 python 对象,然后您可以访问 key user_id

它应该是这样的:

with open("AccInformation.json") as file:
    data = json.loads(file.read())
    account = json.loads(data[0])
    print(account["user_id"])

另一个提示:您可以将文件传递给json.load(),因此您无需调用file.read()

with open("AccInformation.json") as file:
    data = json.load(file)
    account = json.loads(data[0])
    print(account["user_id"])

有关jsonlib 和示例的更多信息:https ://docs.python.org/3/library/json.html

于 2021-08-31T08:15:06.127 回答
1

如果您必须坚持您的文件结构:(但请注意此语法不是 JSON 文件)

[
    "{\"user_id\": 88387467586, \"firstName\": \"Murat\", \"lastName\": \"KO\\u00c7\", \"email\": \"vehbikoc@kocholding.com.tr\", \"username\": \"kocholding\", \"password\": \"123456789\", \"accountKEY\": \"Y29K-G6LF-MRDI-PT5S-BZ1Q-VA4N\", \"register_date\": \"Mon Aug 30 02:01:31 2021\"}",
    "{\"user_id\": 33233303603, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"ZW2G-7960-HPQA-5SKX-LTDJ-YBCE\", \"register_date\": \"Mon Aug 30 14:42:39 2021\"}",
    "{\"user_id\": 86519529854, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"79DG-BNAZ-4IV3-OCKE-H5PM-UJ0T\", \"register_date\": \"Mon Aug 30 15:42:37 2021\"}",
    "{\"user_id\": 51814237688, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"SLVG-F2C6-0QOB-5UJ1-AIHZ-78X4\", \"register_date\": \"Mon Aug 30 22:46:48 2021\"}"
]

使用正则表达式,您可以执行此操作,以便在运行时将当前文件转换为正确的 json 文件:(按原样工作)

with open("AccInformation.json") as file:
    cleaned = file.read().replace(r"(?<!\\)", "")
    cleaned = '{ \n   "data": ' + cleaned + '\n }'
    pre_data = json.loads(cleaned)
    data = [json.loads(x) for x in pre_data.get('data')]
    print(data[0]['user_id'])
>>> 88387467586

否则请重构您的代码,使您的 json 文件看起来像这样:

{
    "data": [
        {\"user_id\": 88387467586, \"firstName\": \"Murat\", \"lastName\": \"KO\\u00c7\", \"email\": \"vehbikoc@kocholding.com.tr\", \"username\": \"kocholding\", \"password\": \"123456789\", \"accountKEY\": \"Y29K-G6LF-MRDI-PT5S-BZ1Q-VA4N\", \"register_date\": \"Mon Aug 30 02:01:31 2021\"},
        {\"user_id\": 33233303603, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"ZW2G-7960-HPQA-5SKX-LTDJ-YBCE\", \"register_date\": \"Mon Aug 30 14:42:39 2021\"},
        {\"user_id\": 86519529854, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"79DG-BNAZ-4IV3-OCKE-H5PM-UJ0T\", \"register_date\": \"Mon Aug 30 15:42:37 2021\"},
        {\"user_id\": 51814237688, \"firstName\": \"Sema\", \"lastName\": \"UZUN\", \"email\": \"sema12@gmail.com\", \"username\": \"semazen\", \"password\": \"123456789\", \"accountKEY\": \"SLVG-F2C6-0QOB-5UJ1-AIHZ-78X4\", \"register_date\": \"Mon Aug 30 22:46:48 2021\"}
    ]
}

然后你可以按预期调用:

with open("AccInformation.json") as file:
    data = json.loads(file.read())["data"]
    print(data[0]['user_id'])
于 2021-08-31T08:30:35.360 回答