【问题标题】:Taking 1 specific item out of JSON response using Python使用 Python 从 JSON 响应中取出 1 个特定项目
【发布时间】:2015-06-22 20:37:45
【问题描述】:

我正在尝试获取“id”号码,然后在程序中使用它。如果重要,响应是 .json

{"run_at":1818086502,"quantity":295092,"queue":"units","original_duration":388900193,"duration":388900193,"unit_type":"Harrier","city_id":1102142875,"id":3720348749},"success":true}}

这是“id”所在的响应的一部分。

这就是我目前所拥有的:

cadena= "Draoumculiasis" + params + "LandCrocodile" + url + "Bevar-Asp" 
cadenau=cadena.encode('utf8')
m=hashlib.sha1(cadenau)
xs3=m.hexdigest()
headers= { 'Host': realm , 'Connection': 'keep-alive', 'Content-Length': len(params), 'Origin': 'http://castlemania-production.s3.amazonaws.com', 'x-s3-aws': xs3, 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11', 'content-type': 'application/x-www-form-urlencoded', 'Accept': '*/*', 'Accept-Encoding': 'gzip,deflate,sdch', 'Accept-Language': 'es-ES,es;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'DNT': 1, 'Cookie': cookie }
conn=http.client.HTTPConnection(realm,80)
conn.request("POST",url,params, headers)
response=conn.getresponse() 

ID 每次都会改变。

我已经制作了制作 id 和使用 id 的部分,我需要连接这两者而无需手动输入。 可悲的是,我不是程序员,所以如果可能的话,我正在寻找完整的解决方案。我做了一些研究,但无法弄清楚。

更新 1

正如戈德的回答中所建议的那样,我使用

responseData = response.read().decode('utf-8')
items = json.loads(responseData)

现在我得到了错误

Traceback (most recent call last):
  File "N:\Files\doa\Py's\testinggettingid.py", line 54, in <module>
    items = json.loads(responseData)
  File "C:\Python34\lib\json\__init__.py", line 318, in loads
    return _default_decoder.decode(s)
  File "C:\Python34\lib\json\decoder.py", line 343, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python34\lib\json\decoder.py", line 361, in raw_decode
    raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line1 column 1 (char 0)

更新 2 我已经通过

删除了错误
    response=conn.getresponse() 
responseData = response.read().decode('utf-8')
print(responseData)
items = json.loads(responseData)
idValue = items['id']
print(idValue)

但它显示的是我的玩家 ID 而不是工作 ID。

更新 3

按要求打印(response.getheaders())

【问题讨论】:

  • “我不是程序员,所以如果可能的话我正在寻找完整的解决方案” - 这不是代码编写服务;如果您需要开发人员,请雇用一位。但请注意,代码和 JSON 数据都是文本 - 为什么您将它们作为场外屏幕截图提供?!
  • 我在 URL 中看不到 id。请不要链接到屏幕截图。包括图片或代码。
  • edit您的问题包括代码和/或示例数据作为文本。屏幕截图不是很有帮助(尤其是当它们发布在显然需要 Flash 的充满广告的网站上时)。
  • 抱歉,第一次发帖。已编辑,如果我知道开发人员,我会雇用它 ^^ 我怀疑这对有经验的人来说很难,但对我来说是这样。
  • 您的 JSON 格式无效

标签: python json response


【解决方案1】:

如果我理解正确,您有一个 JSON 响应,并且您想要提取名为“id”的字段的值。从您的问题来看,您似乎不熟悉 JSON 语法。如果是这种情况,请咨询W3schools' JSON syntax manual 和/或the documentation for Python's JSON library

import json
response = json.loads("{\"msg\": {\"run_at\":1818086502,\"quantity\":295092,\"queue\":\"units\",\"original_duration\":388900193,\"duration\":388900193,\"unit_type\":\"Harrier\",\"city_id\":1102142875,\"id\":3720348749},\"success\": true}")
print response["msg"]["id"]

上面的代码打印对象“msg”中字段“id”的值。

【讨论】:

  • 是的,你明白我的意思。但是,当每个响应都不同时,我不知道如何获取 id。
  • 但是JSON对象的结构每次肯定都是一样的吧?
  • 是的,它总是一样的。
  • 能否请您发布整个 JSON 响应?
  • 有点太长了。不知道如何将其全部发布。有超过 3k 个字符。
【解决方案2】:

考虑一个简化的示例,其中您的代码行

>>> response=conn.getresponse()

已从服务器检索响应并将其保存为HTTPResponse object,当您.read() 响应时,您会看到这样的 JSON 字符串

>>> responseData = response.read().decode('utf-8')
>>> responseData
'{"day": "Thursday", "id": 3720348749}'

您可以使用 Python 的内置 JSON 解码器将其转换为名为 items 的 Dictionary 对象

>>> import json
>>> items = json.loads(responseData)

现在您可以通过引用键为 'id' 的 Dictionary 条目来提取 id

>>> idValue = items['id']
>>> print(idValue)
3720348749

如果您明天运行相同的代码并且返回的 response 对象包含

>>> responseData = response.read().decode('utf-8')
>>> responseData
'{"day": "Friday", "id": 4567890123}'

那么同一组步骤将提取id 的新值

>>> import json
>>> items = json.loads(responseData)
>>> idValue = items['id']
>>> print(idValue)
4567890123

更新

如果您的实际 JSON 数据包含嵌套元素,那么您可能需要使用多个“键”值来标识您想要的项目。例如,如果您要检索的“id”实际上是

result
    job
        id

即 JSON 看起来像

'{"result": {"job": {"id": 12345678}}}'

那么你将需要使用

idValue = items['result']['job']['id']

【讨论】:

  • 我现在觉得自己很蠢。我得到:Typeerror:json对象必须是str,而不是'HTTPresponse'。这是否意味着它不是json? ://
  • prntscr.com/6vbsko 为链接道歉,不知道如何在这里发布代码。这是我现在面临的错误。非常感谢您的帮助
  • @Jacob 有关在编辑问题时发布代码的帮助,请查看here。至于错误,responseData 似乎包含 JSON 解码器无法理解的内容。拥有您的脚本print(responseData),然后向我们展示它的外观。如果它很大,请将其发布到pastebin 之类的网站,然后在此处发布链接。请包括整个 responseData,而不仅仅是您认为可能相关的内容。 (如果某些数据是机密的,则将其混淆为 XXXXX 或类似名称,但不要只是将其删除。)
  • pastebin.com/LrXLFxGj 这是完整的回复。我也可以通过我的脚本得到这个(当我也解码它时),但是当我添加获取“id”的指令时,我从之前得到了错误。
  • @Jacob 这是有效的 JSON(数字被 XXXXX 混淆的情况除外——抱歉,我可能应该推荐 11111)并且我的 Python 3.4 副本可以对其进行解码。请print(response.getheaders()) 并更新您的问题,向我们展示它的样子。
猜你喜欢
  • 2021-10-28
  • 1970-01-01
  • 2021-12-19
  • 2020-07-28
  • 2022-11-27
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多