【问题标题】:can't retrieve value from JSON results无法从 JSON 结果中检索值
【发布时间】:2015-08-08 01:28:31
【问题描述】:

我正在使用 REST 调用从表中检索条目,方法是按属性搜索,将字节转换为字符串,然后从结果中获取 objectId 值。

new_requests = Popen(['curl',
                  '-H', 'application-id: %s' % backendless_appid,
                  '-H', 'secret-key: %s' % backendless_sk,
                  '-H', 'Content-Type: application/json',
                  '-X', 'GET',
                  '-v', 'https://api.backendless.com/v1/data/Request?where=requestId%3D1'],
                 stdout=PIPE).communicate()[0]

new_requests_str = new_requests.decode(encoding='utf-8')

new_requests_objectid = json.loads(new_requests_str, strict=False)['objectId']

不幸的是,这导致KeyError: 'objectId'

print(new_requests_str)返回JSON结果,所以问题是new_requests_objectid

{"offset":0,"data":[{"emailAddress":"eric@apakau.com","apiEndpoint":"http://www.yahoo.com","created":1438986033000,"requestId":"1","___class":"Request","ownerId":null,"updated":1439222409000,"objectId":"723B5AEE-5D60-E00E-FF92-ACA3B4629F00","apiSecretkey":"asdfasa","__meta":"{\"relationRemovalIds\":{},\"selectedProperties\":[\"emailAddress\",\"apiEndpoint\",\"created\",\"requestId\",\"___class\",\"ownerId\",\"updated\",\"objectId\",\"apiSecretkey\"],\"relatedObjects\":{}}"}],"nextPage":null,"totalObjects":1}

【问题讨论】:

  • 尝试打印new_requests_str,你会得到什么?
  • 你为什么从 python 调用 cURL 二进制文件?我强烈建议您查看requests如果真的认为出于某种原因需要 cURL,请查看PycURL
  • @Anand print(new_requests)print(new_requests_str) 都没有返回任何内容。
  • @AnandSKumar 实际上,再次尝试后,new_requests_str 返回 JSON 结果。所以看来问题出在new_requests_objectid
  • 那你能用print的结果示例更新问题吗?

标签: python json rest curl backendless


【解决方案1】:

objectId 不是 new_requests json 中的直接键。相反,它是data 列表中字典的一部分。所以你需要像那样访问它。请求最有可能返回包含多个对象(和多个 objectIds )的响应,所以我建议将它们保存在一个列表中,示例 -

new_requests = Popen(['curl',
                  '-H', 'application-id: %s' % backendless_appid,
                  '-H', 'secret-key: %s' % backendless_sk,
                  '-H', 'Content-Type: application/json',
                  '-X', 'GET',
                  '-v', 'https://api.backendless.com/v1/data/Request?where=requestId%3D1'],
                 stdout=PIPE).communicate()[0]

new_requests_str = new_requests.decode(encoding='utf-8')

new_requests_objectIds = []

for data_item in json.loads(new_requests_str, strict=False)['data']:
    new_requests_objectIds.append(data_item['objectId'])

【讨论】:

  • 我现在明白了。您的代码有效。结果在括号和单引号内:['723B5AEE-5D60-E00E-FF92-ACA3B4629F00']我如何删除它们?
  • 是的,因为它是一个列表,为什么要删除它们?您是否 100% 确定您将始终只有 1 个数据? , 1 个对象 ID?
  • 不,我有时会有超过 1 个 objectId。我在数据结构方面没有很强的背景,所以我将不得不研究列表。如果不难回答:如果我得到两个 objectId,我将如何将它们分配为单独的变量?
  • 没有列表是一个好方法,要处理列表中的两个不同的objectId,您可以遍历它们并分别处理。如果您有任何其他语言的背景,例如 C 或 java 或 C++ 等。列表就像那里的数组,您可以为它们下标(list[0] 指向列表中的第一个元素),使用 for 循环等迭代它们.
  • 谢谢。现在我记得学习数组和下标(我不是计算机科学专业的,但参加了一些编程入门课程)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多