【问题标题】:How can I count the number of times an item appears in a JSON object? Django如何计算一个项目在 JSON 对象中出现的次数?姜戈
【发布时间】:2017-06-01 17:20:20
【问题描述】:

我开发了以下代码来从 Web API 中提取数据,并尝试根据以下条件对其进行操作:计算用户在日期之间出现的次数初始日期是当前时间 - 6 天,最后日期为当前时间。

我收到的 JSON 对象具有以下结构:

[{
id: 1003384,
user_id : 0001
CreatedOn: "2017-02-16 15:54:48",
Problem: "AVAILABILILTY",
VIP: "YES",
Vendor_CODE: "XYZ12345",
Week_id: "07",
},
{
id: 1003338,
user_id: 0002
CreatedOn: "2017-02-15 13:49:16",
Problem: "AVAILABILILTY",
VIP: "NO",
Vendor_CODE: "XYZ67890",
Week_id: "09",
},
{
id: 1553338,
user_id: 0002
CreatedOn: "2017-03-15 09:30:36",
Problem: "AVAILABILILTY",
VIP: "YES",
Vendor_CODE: "ACE67890",
Week_id: "13",
}]

现在,当我执行以下代码时,我无法计算用户在给定两个日期之间出现的次数,因为我得到错误键应该是整数而不是字符串,我不知道应该在哪里实现初始日期和最终日期.

from datetime import datetime, timedelta
from rest_framework.response import Response
import json, urllib.request
from collections import Counter

#Request a response to the Web API
def get_data(request, *args, **kwargs):
    # YYYY-MM-DD
    start_date = datetime.now() - timedelta(days=7)
    end_date = datetime.now() - timedelta(days=1) 

    with urllib.request.urlopen("http://10.61.202.98:8081/T/ansdb/api/rows/triage/ect/tickets",timeout=15) as url:
    response_data = json.loads(url.read().decode())

    #verify that you receive data in your terminal
    print(response_data[0]) 

    # The JSON object should be manipulated as a dictionary but this is not the case
    user_times = Counter(k['user_id'] for k in response_data if k.get('user_id'))

    return JsonResponse(response_data, safe=False)

为了避免错误键应该是整数而不是字符串,我使用 print(response_data[0]) 来获取输出:

{
id: 1003384,
user_id : 0001
CreatedOn: "2017-02-16 15:54:48",
Problem: "AVAILABILILTY",
VIP: "YES",
Vendor_CODE: "XYZ12345",
Week_id: "07",
}

我的问题是:

  1. 当我使用 json.loads(url.read().decode()) 解析我的 JSON 数据后,它是字典吗?如果是这样,为什么我无法将数据检索为 response_data['user_id'] 以查看所有用户?

  2. 代码中缺少什么来计算用户为了工作而出现的次数?

  3. 我应该在哪里实现日期代码以按给定日期检索用户?

在此先感谢,请随时对这篇文章提出任何想法。

更新 2017 年 6 月 6 日

  1. 我解析的 JSON 数据是一个字典,我可以验证它,因为我使用了 print(isinstance(response_data[0],dict)),结果为 True。

  2. 我尝试使用 print(response_data.keys()) 打印此字典中的键,但 遇到此错误:列表对象没有属性“键”。如果 Python 声明这是一本字典但我无法打印密钥,这怎么可能

【问题讨论】:

  • 不要打印,试试这个isinstance(response_data[0], dict),看看它是否真的是一本字典,然后把结果贴出来
  • 我做了 print(isinstance(response_data[0],dict)),结果是 True。

标签: python json django python-3.x


【解决方案1】:

第一:你不能做response_data['user_id'],因为response_data是一个列表。所以,你必须这样做response_data[0]['user_id']

第二:您的代码应该在列表理解中:

Counter([k['user_id'] for k in response_data if k.get('user_id')])

第三:你应该在你的列表理解中实现它,看起来像这样:

Counter([k['user_id'] for k in response_data if k.get('user_id') and start_date < dateutil.parser.parse(k.get('CreatedOn')) < end_date])

您应该安装dateutil 以使第三个工作。或者使用任何其他方式将字符串转换为日期时间。

希望对您有所帮助!

【讨论】:

  • 当 isinstance() 声明这是一个字典时,response_data 是一个列表吗?
  • @AlejandroRamos 你做了isinstance(response_data[0], dict)isinstance(response_data, dict) 吗?
  • 在你的问题中,它看起来像一个字典列表:[{dict_1}, {dict_2}, {dict_3}]
  • 当我使用 isinstance(response_data[0], dict) 我得到 True 但是当我使用 isinstance(response_data, dict) 我得到 false 这是你最后评论的答案。我是否将 JSON 正确解析为字典?你知道如何简化这个数据结构吗?
  • @AlejandroRamos 如果 response_data 是一个列表并且 response_data[0] 是一个字典,那么你就正确地解析了 JSON。但不是听写。到字典列表。没关系。应用我的建议,你应该会很好。如果出现一些错误,请发布。
猜你喜欢
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
相关资源
最近更新 更多