【问题标题】:How to extract specific fields and values from a JSON with python?如何使用 python 从 JSON 中提取特定字段和值?
【发布时间】:2017-09-05 19:04:44
【问题描述】:

我正在迭代一个 JSON,我想从这个对象中提取以下字段:

  1. 身份证,
  2. 开放日期
  3. 用户
  4. Ticket_status
  5. 结束日期

我拥有的数据结构如下:

filtered_data = 
[{'id': 1021972, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.94', 
'Aging_Un_investigated_Issue': '0.94', 'User': 'John P.', 'ModifiedOn': '2017-09-04 21:29:59', 
'Open_date':'2017-08-04 01:34:18','End_date':'2017-09-05 00:29:01',
'Ticket_status':'Transferred'},{'id': 1036722, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.12', 
'Aging_Un_investigated_Issue': '0.01', 'User': 'John P.', 'ModifiedOn': '2017-09-04 21:29:59', 
'Open_date':'2017-09-01 00:34:18','End_date':'',
'Ticket_status':'Researching'},{'id': 1015621, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.99', 
'Aging_Un_investigated_Issue': '0.11', 'User': 'John D.', 'ModifiedOn': '2017-06-05 12:19:59', 
'Open_date':'2017-01-01 00:00:18','End_date':'2017-09-01 20:20:57',
'Ticket_status':'Closed'}]

我想返回一个数据结构,例如字典(如果您认为有更好的数据结构可以实现我的目标,请提及)如下:

dict_user_john_p = {'ID':1021972,'Open_date':'2017-08-04 01:34:18','Ticket_status':'Transferred','End_date':'2017-09-05 00:29:01',
'ID':1036722,'Open_date':'2017-09-01 00:34:18','Ticket_status':'Researching','End_date':''}

dict_user_john_D = {'ID':1015621,...,'End_date':'1015621'}

如何提取提到的特定字段并将它们作为另一个数据结构(字典)返回?

【问题讨论】:

  • 提示:没有“JSON”之类的东西。您的数据结构是一个包含普通字典的普通列表。您可以像访问任何其他列表或字典的数据一样访问他们的数据。
  • 但是我怎样才能得到字典的每个键和值并将它们排列成一个呢?
  • 至于有很多个人词典,其名称仅因用户名而异,请参阅 Tigerhawk 在stackoverflow.com/a/38972761/953482 的回答。 TLDR 是:“不要那样做。相反,将所有值存储在字典中”

标签: python json python-3.x


【解决方案1】:

filtered_data 是一个普通列表,因此您可以使用普通索引或迭代从中访问各个字典。您可以将每个元素放入一个新字典中,并以用户名作为关键字:

filtered_data = [{'id': 1021972, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.94', 
'Aging_Un_investigated_Issue': '0.94', 'User': 'John P.', 'ModifiedOn': '2017-09-04 21:29:59', 
'Open_date':'2017-08-04 01:34:18','End_date':'2017-09-05 00:29:01',
'Ticket_status':'Transferred'},{'id': 1036722, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.12', 
'Aging_Un_investigated_Issue': '0.01', 'User': 'John P.', 'ModifiedOn': '2017-09-04 21:29:59', 
'Open_date':'2017-09-01 00:34:18','End_date':'',
'Ticket_status':'Researching'},{'id': 1015621, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.99', 
'Aging_Un_investigated_Issue': '0.11', 'User': 'John D.', 'ModifiedOn': '2017-06-05 12:19:59', 
'Open_date':'2017-01-01 00:00:18','End_date':'2017-09-01 20:20:57',
'Ticket_status':'Closed'}]

data_by_user = {}
for d in filtered_data:
    data_by_user[d["User"]] = d

print(data_by_user["John P."])

现在您可以使用 John P 的姓名索引新字典来访问 John P 的数据(或任何其他人的数据)。


编辑:您可以通过构建仅从您指定的键中明确选择的新字典来选择哪些键/值对将在新字典中:

data_by_user = {}
for d in filtered_data:
    data_by_user[d["User"]] = {k:d[k] for k in ("id", "Open_date", "User", "Ticket_status", "End_date")}

【讨论】:

  • 一个观察结果:我得到了 John P. 的所有数据,但我得到了所有的键和值。是不是只能获取键值ID、open_date、user、ticket_status、end_date?
  • 有很多方法可以做到这一点,但最简单的可能是只遍历你想要的键,然后只添加它们。已编辑。
猜你喜欢
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2019-04-19
  • 2011-03-05
  • 2023-03-30
  • 2021-11-09
  • 2017-01-06
相关资源
最近更新 更多