【问题标题】:Print All JSON Results if Key Value Equals True如果键值等于 True,则打印所有 JSON 结果
【发布时间】:2020-10-12 15:13:21
【问题描述】:

我知道这可能是一个简单的问题,但我是一个菜鸟,我花了 3 天时间寻找我的问题的答案,但没有运气。

这是我要搜索的 JSON 结果示例。如果键 "IsFree" = true,我只想打印 JSON 结果。

[
{
"InventorySliceId": 20946771,
"InventoryDateId": 8050,
"StartTime": "2020-10-16T00:00:00",
"UnitId": 5096,
"UnitTypeId": 4303,
"IsPremium": false,
"IsFree": false,
"IsBlocked": false,
"IsReserved": true,
"IsWalkin": false,
"ReservationId": 2651378,
"FacilityId": 377,
"LockExpiration": "0001-01-01T00:00:00",
"IsLocked": false
 },

老实说,我已经尝试了 50 种不同的代码示例,每次我遇到关于数据需要是 int 等的错误。这是我放在一起的当前代码,它什么也没打印。

import json
import urllib.request

# download raw json object
url = 
"https://calirdr.usedirect.com/rdr/rdr/fd/availability
/getbyunit/5096/startdate/2020-10-16/nights/5/true? "

data = urllib.request.urlopen(url).read().decode()

# parse json object
obj = json.loads(data)

for i in obj:
if i['IsFree'] == 'false':
    print(json.dumps(obj, indent=1))

【问题讨论】:

  • “老实说,我已经尝试了 50 种不同的代码示例,但每次都遇到错误”:这表明您没有阅读错误或正在尝试通过反复试验进行编码。该错误通常会准确地告诉您出了什么问题。对错误进行故障排除对于程序员来说绝对是一项至关重要的技能。请正确format您问题中的代码,并edit它包含json文件和错误消息。欢迎来到 Stack Overflow!
  • 如果您修复了最后一个 for i in obj: 块的缩进,并且将 == 'false' 更改为 == False,那么您的代码非常好。 json.loads() 将 json 字符串中的 "IsFree": "false" 转换为 python dict 中的 ["IsFree"] = False,所以你只需要做 if i['IsFree'] == False:,或者更简洁,if not i['IsFree']:

标签: json python-3.x urllib


【解决方案1】:

您可以尝试使用请求的内置 json 响应,它将其转换为有效的 python dict(或在您的情况下,dicts 列表)

import requests
from pprint import pprint
resp = requests.get("https://calirdr.usedirect.com/rdr/rdr/fd/availability/getbyunit/5096/startdate/2020-10-16/nights/5/true?")
for res in resp.json():
    if res['IsFree'] is False:
        pprint(res)

结果:

[{'InventorySliceId': 20946771,
  'InventoryDateId': 8050,
  'StartTime': '2020-10-16T00:00:00',
  'UnitId': 5096,
  'UnitTypeId': 4303,
  'IsPremium': False,
  'IsFree': False,
  'IsBlocked': False,
  'IsReserved': True,
  'IsWalkin': False,
  'ReservationId': 2651378,
  'FacilityId': 377,
  'LockExpiration': '0001-01-01T00:00:00',
  'IsLocked': False},
 {'InventorySliceId': 20946968,
  'InventoryDateId': 8049,
  'StartTime': '2020-10-17T00:00:00',
  'UnitId': 5096,
  'UnitTypeId': 4303,
  'IsPremium': False,
  'IsFree': False,
  'IsBlocked': False,
  'IsReserved': True,
  'IsWalkin': False,
  'ReservationId': 2651378,
  'FacilityId': 377,
  'LockExpiration': '0001-01-01T00:00:00',
  'IsLocked': False},
 {'InventorySliceId': 20947072,
  'InventoryDateId': 8052,
  'StartTime': '2020-10-18T00:00:00',
  'UnitId': 5096,
  'UnitTypeId': 4303,
  'IsPremium': False,
  'IsFree': False,
  'IsBlocked': False,
  'IsReserved': True,
  'IsWalkin': False,
  'ReservationId': 2583386,
  'FacilityId': 377,
  'LockExpiration': '0001-01-01T00:00:00',
  'IsLocked': False},
 {'InventorySliceId': 20947253,
  'InventoryDateId': 8051,
  'StartTime': '2020-10-19T00:00:00',
  'UnitId': 5096,
  'UnitTypeId': 4303,
  'IsPremium': False,
  'IsFree': False,
  'IsBlocked': False,
  'IsReserved': True,
  'IsWalkin': False,
  'ReservationId': 2583386,
  'FacilityId': 377,
  'LockExpiration': '0001-01-01T00:00:00',
  'IsLocked': False},
 {'InventorySliceId': 20947341,
  'InventoryDateId': 8053,
  'StartTime': '2020-10-20T00:00:00',
  'UnitId': 5096,
  'UnitTypeId': 4303,
  'IsPremium': False,
  'IsFree': False,
  'IsBlocked': False,
  'IsReserved': True,
  'IsWalkin': False,
  'ReservationId': 2527842,
  'FacilityId': 377,
  'LockExpiration': '0001-01-01T00:00:00',
  'IsLocked': False}]

【讨论】:

  • 谢谢大家的帮助,我真的很感激。这个网站太棒了!
【解决方案2】:

为此,您必须更改代码

obj = json.loads(data)

for i in obj: if i['IsFree'] == 'false': print(json.dumps(obj, indent=1))`

for i in obj: if i[0].IsFree == 'false':print(json.dumps(obj, indent=1))

应该可以正常使用

【讨论】:

  • 这个答案是错误的! 一旦 OP 加载 obj = json.loads(data),迭代 i in obj 就不需要做 i[0]。此外,i[0].IsFree 不起作用!这不是您访问字典元素的方式。最后,== 'false' 也是错误的。 json.loads'false' 解析为布尔值 False 值。 这个答案可能有问题的地方都是错误的。
猜你喜欢
  • 2023-01-24
  • 2018-05-16
  • 1970-01-01
  • 2021-12-13
  • 2013-10-23
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2019-09-07
相关资源
最近更新 更多