0

免责声明:我是面向对象 Python 的新手。

我的最终目标是一次从许多具有相同结构的 JSON 文件中提取数据,并从数据中计算出新的东西,并将所有这些存储在 MySQL 数据库中。
如何从 JSON 文件中获取数据并输入 Python 中的自定义对象结构?
我需要这样做,因为需要使用读取的每个连续 JSON 文件重新计算统计信息,并且对象的内容可能会根据累积的数据而有所不同。

一般的想法是,每个 JSON 都是一个在两支球队之间进行的足球比赛对象。
一个“比赛”对象包含两个“球队”对象,即比赛时间、观众人数和比赛日期。
“球队”对象包含球队的总得分(随球队参加的每场比赛而变化)、“惩罚”对象列表和 JSON 中可能出现或不出现的“目标”以及“球员”对象的列表,一些其中在首发名单中。
“球员”是一个对象,它有一个唯一的姓名组合、一个数字,指的是“罚球”和“进球”对象以及这些对象所具有的属性。

当“惩罚”类型对象仅通过其编号引用“玩家”对象并将信息添加到“团队”和“玩家”类型对象时,问题就开始了。

  • 我曾考虑过使用字典,但据我了解,由于球员与点球和进球联系在一起的方式,这不会奏效。
  • 我曾考虑过一个一个地检索值,但这需要一些非常难以调试的控制流类型代码,并且对象再次相互引用的方式会有困难。
  • 我已经查看了棉花糖库,但是由于作为 Python 的 OOP 新手,我仍然在努力理解简单示例的工作原理。

将传递给脚本的 JSON 字符串示例:

{"Game": {
 "Time": "2017/01/11",
 "Spectators": 6740,
 "Location": "Newlands Stadium",
 "T": [
  {
   "Surname": "Antamo",
   "Name": "Dennis"
  },
  {
   "Surname": "Prompa",
   "Name": "Pedro"
  }
 ],
 "Team": [
  {
   "TeamName": "Barcelona",
   "Players": {"Player": [
    {
     "Role": "V",
     "Nr": 16,
     "Surname": "Sam",
     "Name": "Sidney"
    },
    {
     "Role": "A",
     "Nr": 17,
     "Surname": "Cisovsky",
     "Name": "Marian"
    },
    {
     "Role": "U",
     "Nr": 24,
     "Surname": "Verratti",
     "Name": "Marco"
    },
    {
     "Role": "A",
     "Nr": 27,
     "Surname": "Hummels",
     "Name": "Mats"
    },
    {
     "Role": "U",
     "Nr": 33,
     "Surname": "Quintero",
     "Name": "Juan"
    },
    {
     "Role": "U",
     "Nr": 37,
     "Surname": "Díaz",
     "Name": "Marcelo"
    },
    {
     "Role": "A",
     "Nr": 39,
     "Surname": "Criscito",
     "Name": "Domenico"
    },
    {
     "Role": "A",
     "Nr": 55,
     "Surname": "Filip",
     "Name": "Lucian"
    },
    {
     "Role": "V",
     "Nr": 56,
     "Surname": "Saviola",
     "Name": "Javier"
    },
    {
     "Role": "A",
     "Nr": 64,
     "Surname": "Streller",
     "Name": "Marco"
    },
    {
     "Role": "U",
     "Nr": 73,
     "Surname": "Weidenfeller",
     "Name": "Roman"
    },
    {
     "Role": "A",
     "Nr": 75,
     "Surname": "Amelia",
     "Name": "Marco"
    },
    {
     "Role": "A",
     "Nr": 84,
     "Surname": "Sandro",
     "Name": "Alex"
    },
    {
     "Role": "U",
     "Nr": 89,
     "Surname": "Djuricic",
     "Name": "Filip"
    },
    {
     "Role": "A",
     "Nr": 94,
     "Surname": "Varela",
     "Name": "Silvestre"
    },
    {
     "Role": "A",
     "Nr": 96,
     "Surname": "Sauro",
     "Name": "Gastón"
    }
   ]},
   "StartingLineUp": {"Player": [
    {"Nr": 37},
    {"Nr": 75},
    {"Nr": 73},
    {"Nr": 16},
    {"Nr": 24},
    {"Nr": 96},
    {"Nr": 55},
    {"Nr": 89},
    {"Nr": 27}
   ]},
   "Goals": {"VG": [
    {
     "Time": "06:09",
     "P": [
      {"Nr": 96},
      {"Nr": 55}
     ],
     "Nr": 24,
     "ShotOnGoal": "N"
    },
    {
     "Time": "11:07",
     "P": [
      {"Nr": 24},
      {"Nr": 37},
      {"Nr": 16}
     ],
     "Nr": 73,
     "ShotOnGoal": "N"
    }
   ]},
   "PlayerChanges": {"PlayerChange": {
    "Time": "23:34",
    "Nr1": 16,
    "Nr2": 64
   }},
   "Penalties": {"Penalty": [
    {
     "Time": "41:40",
     "Nr": 27
    },
    {
     "Time": "56:24",
     "Nr": 96
    }
   ]}
  },
  {
   "TeamName": "Skolmeistari",
   "Players": {"Player": [
    {
     "Role": "A",
     "Nr": 9,
     "Surname": "Debess",
     "Name": "Nils"
    },
    {
     "Role": "A",
     "Nr": 21,
     "Surname": "Zibens",
     "Name": "Vilhelms"
    },
    {
     "Role": "V",
     "Nr": 22,
     "Surname": "Rausis",
     "Name": "Vidmants"
    },
    {
     "Role": "A",
     "Nr": 25,
     "Surname": "Zibens",
     "Name": "Janka"
    },
    {
     "Role": "U",
     "Nr": 28,
     "Surname": "Palodze",
     "Name": "Rihards"
    },
    {
     "Role": "A",
     "Nr": 30,
     "Surname": "Paraugs",
     "Name": "Ciltvairis"
    },
    {
     "Role": "A",
     "Nr": 33,
     "Surname": "Antena",
     "Name": "Bo"
    },
    {
     "Role": "U",
     "Nr": 34,
     "Surname": "Grants",
     "Name": "Linards"
    },
    {
     "Role": "U",
     "Nr": 36,
     "Surname": "Rokturis",
     "Name": "Francis"
    },
    {
     "Role": "A",
     "Nr": 39,
     "Surname": "Svilpe",
     "Name": "Einars"
    },
    {
     "Role": "V",
     "Nr": 41,
     "Surname": "Zirnis",
     "Name": "Anderss"
    },
    {
     "Role": "A",
     "Nr": 44,
     "Surname": "Kompass",
     "Name": "Rolands"
    },
    {
     "Role": "U",
     "Nr": 47,
     "Surname": "Kabacis",
     "Name": "Kens"
    }
   ]},
   "StartingLineUp": {"Player": [
    {"Nr": 9},
    {"Nr": 36},
    {"Nr": 21},
    {"Nr": 39},
    {"Nr": 25},
    {"Nr": 34},
    {"Nr": 30},
    {"Nr": 28},
    {"Nr": 47}
   ]},
   "Goals": {"VG": [
    {
     "Time": "20:04",
     "P": [
      {"Nr": 9},
      {"Nr": 25}
     ],
     "Nr": 47,
     "ShotOnGoal": "N"
    },
    {
     "Time": "35:38",
     "P": [
      {"Nr": 30},
      {"Nr": 28},
      {"Nr": 44}
     ],
     "Nr": 34,
     "ShotOnGoal": "N"
    },
    {
     "Time": "63:21",
     "P": {"Nr": 34},
     "Nr": 39,
     "ShotOnGoal": "N"
    }
   ]},
   "PlayerChanges": {"PlayerChange": {
    "Time": "29:24",
    "Nr1": 25,
    "Nr2": 44
   }},
   "Penalties": {"Penalty": {
    "Time": "50:57",
    "Nr": 36
   }}
  }
 ],
 "VT": {
  "Surname": "Rausis",
  "Name": "Rihards"
 }
}}

编辑:措辞和格式

4

1 回答 1

0

嗯,不确定这是否会帮助您入门,但您可以使用 Python 的json模块。

假设您将 JSON 文件命名为“my_soccer_file.json”并将其保存在与 Python 脚本相同的目录中。我们可以使用json.load()如下方式加载该 JSON 文件:

import json

with open('my_soccer_file.json', 'r') as f:
    my_data = json.load(f)

事实上,如果你只是在这个代码块之后包含一个 print 语句来检查我们是否正确地导入了对象

print(my_data["Game"]["Time"]) // returns "2017/01/11"
print(my_data["Game"]["T"][0]) // returns { 'Surname': 'Antamo', 'Name': 'Dennis' }

JSON 对象的值会很好地返回。希望您能够通过此示例正确表示对象,并且这里也有一篇很好的文章

于 2018-01-13T12:51:35.233 回答