【问题标题】:simplejson returns values not in order [duplicate]simplejson返回值不按顺序[重复]
【发布时间】:2013-07-21 07:01:58
【问题描述】:

在 Django 中使用simplejson 时,有时我需要严格按顺序发送信息。

values = {"entry1":"value1","entry2":"value2","entry3":"value3"}
return HttpResponse(simplejson.dumps(values),content_type="application/json")

这就是它返回的内容

{"entry2": "value2", "entry3": "value3", "entry1": "value1"}

但我希望它返回这个:

{"entry1":"value1","entry2":"value2","entry3":"value3"}

如何在simplejson中按顺序发送信息?

【问题讨论】:

  • 这是一个字典。它没有订单。

标签: python django json simplejson


【解决方案1】:

我有时需要严格按顺序发送信息。那么不要使用字典,使用元组列表:

values = [("entry1", "value1"), ("entry2", "value2"), ("entry3", "value3")]

字典 JSON 对象没有固定的顺序。两者都不会保留您的输入顺序,也不是必需的。

引用JSON RFC

对象是零个或多个名称/值对的无序集合 [...]

和 Python dict.items() 文档:

键和值以非随机的任意顺序列出,因 Python 实现而异,并且取决于字典的插入和删除历史。

【讨论】:

  • @jh314 答案似乎也有效。什么更可取?使用列表或sort_keys=True?
  • @Jerry:如果您需要按排序顺序返回密钥,请使用sort_keys但是,这并不能保证 JSON 数据的消费者不会忽略对象键的顺序。如果顺序很重要,请使用列表来保留顺序。
  • @Jerry:如果您的密钥按排序顺序提供,那么sort_keys 当然仍会为您更改排序。例如,{'foo': 1, 'bar': 2, 'eggs': 'ham'} 将按bareggsfoo 的顺序返回。
  • 完美答案。谢谢!
  • 作为脚注,sort_keys 的主要观点是生成稳定的输出(例如,用于测试,或避免对缓存进行核对等 - 在最近使用随机哈希种子的 Python 版本中尤为重要) ,而不是处理未正确实现 JSON 规范的解码器。如果您控制应用程序的双方,请修复使用者。
【解决方案2】:

按照 Martjin Pieters 的建议,解决此问题的传统方法是使用二维元组/列表。

不过,更 Pythonic 的方式是使用 OrderedDict。

对于类似的问题/解决方案,请参阅: Can I get JSON to load into an OrderedDict in Python?

有关 OrderedDict 文档,请参阅:http://docs.python.org/2/library/collections.html#collections.OrderedDict

【讨论】:

    【解决方案3】:

    这不是simplejson 的问题,这是dict 在python 中的行为。 dicts 没有排序,所以你无法真正预测它们会以什么顺序出现。

    您可以重新格式化您的数据以按以下顺序获取:

    values = [ {"entry1":"value1"}, { "entry2":"value2"} ,{"entry3":"value3"} ]
    

    values = [ {"key":"entry1", "value":"value1"},
               {"key":"entry2", "value":"value2"},
               {"key":"entry3", "value":"value3"}
             ]
    

    【讨论】:

    • 嗯,这不仅仅是 dicts —— JSON 对象是无序的,因此在读取时依赖于顺序的实现被破坏了。来自ietf.org/rfc/rfc4627.txt:“对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串、数字、布尔值、null、对象或数组。”
    【解决方案4】:

    您可以在转储中使用sort_keys=True 选项:

    simplejson.dumps(values, sort_keys=True)
    

    它将按排序顺序打印出带有键的字典。但是,字典本质上是无序的,因此当您将字典作为参数提供给HttpResponse 时,结果将不按顺序排列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2011-09-19
      • 2020-07-22
      • 1970-01-01
      相关资源
      最近更新 更多