Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将表转换为JSON_Python_Json_Python 3.x_Sqlite - Fatal编程技术网

Python 将表转换为JSON

Python 将表转换为JSON,python,json,python-3.x,sqlite,Python,Json,Python 3.x,Sqlite,我正在用Python 3构建一个测验应用程序。用户会看到一堆线索,他们必须猜测体育明星。我当前的后端使用SQLite,但我希望使用Firebase创建一个实时数据库,因此需要将其更改为JSON格式 该表当前如下所示: Player Name Difficulty Year Club Apps (Goals) player_1 easy 2014 - 2017 club x (y) player_1 easy 2

我正在用Python 3构建一个测验应用程序。用户会看到一堆线索,他们必须猜测体育明星。我当前的后端使用SQLite,但我希望使用Firebase创建一个实时数据库,因此需要将其更改为JSON格式

该表当前如下所示:

Player Name  Difficulty     Year      Club     Apps (Goals)
player_1     easy       2014 - 2017   club        x (y)
player_1     easy       2017 - 2019   club_2      x (y)
player_2     medium     2019 -        club        x (y)
目前,用户选择难度。然后我运行一个SQL查询,它会给我一个所有有这种困难的玩家的列表。然后,应用程序向用户显示最后三列,这是他们猜测玩家所需的线索

为了把它转换成JSON格式,我想它应该是这样的

{
    "users":
    {
        "player_1_id":
        {
            "name": "player_1",
            "difficulty": "difficulty",
            "year": [year_1, year_2, ..., year_n],
            "club": [club_in_year_1, club_in_year_2, ...., club_in_year_n],
            "apps": [apps_in_year_1, apps_in_year_2, ..., apps_in_year_n]
        },
        "player_2_id":
            "name": "player_2",
            ...
    }
}
因此,在每个年度/俱乐部/应用程序列表中,每个球员姓名的值可能不同。我创建并运行了以下代码:

import sqlite3

def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

connection = sqlite3.connect("player_database.db")
connection.row_factory = dict_factory

cursor = connection.cursor()

cursor.execute("select * from player_history")

results = cursor.fetchall()

print(results)

connection.close()
但这会用一个单独的ID打印每一行,这不是我想要的


我如何编辑此文件以获得所需的输出?

以下是映射数据的基本解决方案

定义一个以数据数组为参数的函数 def mapDatadata=[]: 用于存储聚合行的dict 结果={} 遍历数据数组 对于数据中的项目: 的聚合值已存在一个条目 在结果中,dict用于指定名称 如果results.keys中的项[名称]: prev=结果[项目[名称]] 上一个[年度]。附录项[年度] 上一个[俱乐部]。附件项[俱乐部] 上一个[apps].appenditem[apps] continue将跳到下一个迭代 持续 如果没有现有密钥,则创建新条目 对于结果dict中的给定名称 结果[项目[名称]]={ **项目,, 年份:[项目[年度]], 俱乐部:[项目[俱乐部]], 应用:[项目[应用]], } 返回结果 返回结果 一些伪数据看起来像来自sql的数据 sqlData=[ { 姓名:player_1,, 困难:困难,, 年份:2009年, 俱乐部:2003年, 应用程序:2005年, }, { 姓名:player_1,, 困难:困难,, 年份:1999年, 俱乐部:1998年, 应用程序:2008年, }, { 姓名:player_2,, 困难:困难,, 年份:1999年, 俱乐部:1998年, 应用程序:2008年, } ] 将数据传递到函数并分配结果 添加到名为aggregatedData的新变量 aggregatedData=mapDatasqlData 打印结果 打印聚合数据 结果: { 玩家1:{ 姓名:player_1,, 困难:困难,, 年份:[ 2009, 1999 ], 俱乐部:[ 2003, 1998 ], 应用程序:[ 2005, 2008 ] }, 玩家2:{ 姓名:player_2,, 困难:困难,, 年份:[ 1999 ], 俱乐部:[ 1998 ], 应用程序:[ 2008 ] } }
实际上,没有其他方法可以从SQL获得它。您可以聚合这些值,但不会得到真正的数组。否则,您现在必须获取结果行并根据需要更改它们。您可以使用循环和变量来获得所需的结果。使用按用户键入的字典自己聚合结果,该字典本身包含字典和列表,具体取决于您希望按用户组织数据的方式。然后,您可以使用json库写出json格式的字符串。嘿,谢谢您的回复!我不太明白def mapDatadata从哪里来?我必须为此导入数据库吗?我是在从SQLite调用它之前还是之后映射它的?嗯,也许是时候回头看看函数定义了。mapData是一个接受参数的函数。我称之为data,data对应于传入函数的内容,在这里,我传入一个数组。因此,数据是您在最后一行printmapData上看到的数组[…]是您从SQLLte获得的行数组。因此,您可以将从sqlite获得的数组传递到函数中。我将其全部分解并添加注释,以便您更容易理解。我仍然建议大家复习一下基础知识。