【问题标题】:JSON data to custom object structure in PythonJSON数据到Python中的自定义对象结构
【发布时间】:2018-01-03 13:16:57
【问题描述】:

免责声明:我是面向对象 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"
 }
}}

编辑:措辞和格式

【问题讨论】:

  • 没问题?请说明您尝试了什么,您期望什么,以及您得到了什么。
  • 你考虑过namedtuple吗? stackoverflow.com/questions/6578986/…
  • 我无处可去,我正在寻找可以尝试的东西。广泛的谷歌搜索甚至没有产生任何有希望的东西,因此我的问题。
  • 这有点模糊,你的很多“问题”并没有真正的意义。如果您已经创建了一个数据库来存储球队和球员,您可以在那里查找它们,不是吗?
  • 我没有数据库。我想先获取数据的对象表示,然后我会尝试解决将数据导入数据库的问题。

标签: python json oop object marshmallow


【解决方案1】:

嗯,不确定这是否能帮助您入门,但您可以使用 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(my_data["Game"]["Time"]) // returns "2017/01/11"
print(my_data["Game"]["T"][0]) // returns { 'Surname': 'Antamo', 'Name': 'Dennis' }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2021-06-09
    • 1970-01-01
    • 2014-03-21
    • 2012-10-10
    • 2019-02-23
    相关资源
    最近更新 更多