Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换为json会在python中重新排序对象_Python_Json_Python Requests_Steam_Steam Web Api - Fatal编程技术网

转换为json会在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结尾

我正在尝试使用请求从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
结尾,但在
.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中试用