【问题标题】:Converting to json re-orders objects in python转换为 json 在 python 中重新排序对象
【发布时间】:2015-05-15 22:34:01
【问题描述】:

我正在尝试使用请求在 python 中从http://steamcommunity.com/profiles/76561198081591043/inventory/json/730/2 获得响应。

import requests    
url =  "http://steamcommunity.com/profiles/76561198081591043/inventory/json/730/2"   
r = requests.get(url)
print r.text
print r.json()

r.textr.json() 返回排序不同的对象。 例如,在“rgInventory”中,.text 中的前 3 个 "ids":925, 658, 891 结尾,但在 .json() 中以 891, 619, 741 结尾(只是巧合,它们正在下降)。

json.loads(r.text) 产生相同的结果

如何让json 对象与.text 显示的顺序相同?

【问题讨论】:

  • 你没有。 JSON 对象映射到 Python 字典,它们本质上是无序的。
  • 与其说是“无序”,不如说是“任意排序”:项目的顺序是根据散列函数确定的,这取决于你对 Python 的特殊风格,不应依赖它。有什么理由必须完全按照正文中的顺序排列吗?
  • 我不明白无序部分,如果我使用 iteritems() 循环遍历对象 (r['rgInventory'][i]['id'] 并打印它,我会总是让它们以相同的顺序返回,如打印所示
  • 正如@oxymor0n 解释的那样,它们 有序的,只是它以任意方式由Python 的字典内部确定(您无法更改)。一种解决方法是将 JSON 对象映射到 OrderedDicts,而不是像 user2357112 的 answer below 建议的那样 - 尽管根据您要完成的任务,这样做可能是不必要的。

标签: python json python-requests steam steam-web-api


【解决方案1】:

这可能是不必要的,如果有必要,您的代码或 Steam API 已损坏。从您的 cmets 来看,这可能是不必要的。也就是说,这是可行的。

json.loads 采用可选的object_pairs_hook 参数。这指定了一个函数,该函数将使用键值对列表调用以解码对象文字。默认相当于指定object_pairs_hook=dict;要保留键在原始文本中出现的顺序,您可以使用object_pairs_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)

【讨论】:

  • 这只是必要的,因为steam没有适当的库存API,并且返回的文本值按最近的顺序排列,所以检查库存更新最简单的方法,谢谢你的回复我会在早上试一试
【解决方案2】:

JSON 对象不会根据 javascript (Does JavaScript Guarantee Object Property Order?) 的定义进行排序。要获得所需的结果,您必须按键对结果字典进行排序:How can I sort a dictionary by key?

【讨论】:

    【解决方案3】:

    JSON 对象中字段的顺序是明确无意义的,不需要保留。为了提高效率,许多实现都是哈希表。

    如果 JSON 顺序很重要,您必须使用数组——在这种情况下,最简单的模型可能是包含两个元素数组的数组,每个数组又包含一个字符串名称和一个值.

    另一种解决方案是使用非 JSON 字符串处理代码将 JSON 对象字段按摩回您的首选顺序。不推荐!

    抱歉,规范无法识别的差异根本不是差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2011-11-16
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      相关资源
      最近更新 更多