转换为json会在python中重新排序对象
我正在尝试使用请求从python中获取响应转换为json会在python中重新排序对象,python,json,python-requests,steam,steam-web-api,Python,Json,Python Requests,Steam,Steam Web Api,我正在尝试使用请求从python中获取响应 import requests url = "http://steamcommunity.com/profiles/76561198081591043/inventory/json/730/2" r = requests.get(url) print r.text print r.json() r.text和r.json()返回顺序不同的对象。 例如,在'rgInventory'中,前3个“id”:在中。text以92565891结尾
import requests
url = "http://steamcommunity.com/profiles/76561198081591043/inventory/json/730/2"
r = requests.get(url)
print r.text
print r.json()
r.text
和r.json()
返回顺序不同的对象。
例如,在'rgInventory'中,前3个“id”:在中。text
以92565891
结尾,但在.json()
中以891619741
结尾(只是它们在下降的同时发生)
json.load(r.text)
产生相同的结果
如何使json
对象的顺序与相同。text
显示的对象的顺序相同?json对象不是按照javascript()的定义排序的。要获得所需的结果,您必须按键对结果字典进行排序:JSON对象中字段的顺序显然没有意义,不需要保留。为了提高效率,许多实现都是哈希表
如果JSON顺序很重要,那么必须使用数组——在本例中,最简单的模型可能是一个包含两个元素数组的数组,每个元素数组依次包含一个字符串名和一个值
另一种解决方案是使用非JSON字符串处理代码将JSON对象字段重新调整为首选顺序。不推荐
很抱歉,规范无法识别的差异根本不是差异。这可能是不必要的,如果有必要,您的代码或Steam API都会被破坏。从你的评论来看,这可能没有必要。也就是说,这是可行的
json.loads
采用可选的object\u pairs\u hook
参数。这指定了一个函数,该函数将使用键值对列表调用,以解码对象文字。默认值相当于指定object\u pairs\u hook=dict
;要保留键在原始文本中出现的顺序,可以使用object\u pairs\u hook=collections.OrderedDict
:
import collections, json
data = json.loads(response_string, object_pairs_hook=collections.OrderedDict)
r.json()
将关键字参数传递给json.loads
,因此它应该支持相同的参数:
data = r.json(object_pairs_hook=collections.OrderedDict)
你没有。JSON对象映射到Python字典,而Python字典本质上是无序的。与其说是“无序的”,不如说是“任意排序的”:项目的顺序是根据哈希函数确定的,这取决于您特定的Python风格,不应该依赖于此。是否有任何理由说明它必须按照文本中的顺序排列?如果我使用iteritems()在对象中循环(r['rgInventory'][I]['id']打印出来后,我总是以相同的顺序返回它们,正如printAs@oxymor0n解释的那样,它们是有序的,只是Python的字典内部以任意方式确定(您不能更改)。一种解决方法是按照user2357112的建议,将JSON对象映射到OrderedDict
s,尽管这样做可能是不必要的,这取决于您试图完成的任务。这只是因为steam没有合适的库存API,返回的文本值按最新的第一个顺序排列,所以对于checki来说是必要的ng库存更新这是最简单的方法,谢谢你的回复,我会在MRN中试用