首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JSON对象中的项目使用“json.dumps”是不是乱序了?

JSON对象中的项目使用“json.dumps”是不是乱序了?
EN

Stack Overflow用户
提问于 2012-06-01 11:34:46
回答 7查看 156.3K关注 0票数 174

我正在使用json.dumps转换为json,如

代码语言:javascript
复制
countries.append({"id":row.id,"name":row.name,"timezone":row.timezone})
print json.dumps(countries)

我得到的结果是:

代码语言:javascript
复制
[
   {"timezone": 4, "id": 1, "name": "Mauritius"}, 
   {"timezone": 2, "id": 2, "name": "France"}, 
   {"timezone": 1, "id": 3, "name": "England"}, 
   {"timezone": -4, "id": 4, "name": "USA"}
]

我希望这些键按以下顺序排列: id,name,timezone --但是我有timezone,id,name。

我该如何解决这个问题呢?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-05-23 11:14:58

两者都是Pythondict( Python 3.7之前)和JSON object是无序集合。你可以通过sort_keys参数,对键进行排序:

代码语言:javascript
复制
>>> import json
>>> json.dumps({'a': 1, 'b': 2})
'{"b": 2, "a": 1}'
>>> json.dumps({'a': 1, 'b': 2}, sort_keys=True)
'{"a": 1, "b": 2}'

如果您需要特定的订单,您可以collections.OrderedDict:使用

代码语言:javascript
复制
>>> from collections import OrderedDict
>>> json.dumps(OrderedDict([("a", 1), ("b", 2)]))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict([("b", 2), ("a", 1)]))
'{"b": 2, "a": 1}'

从Python 3.6开始

,关键字参数顺序被保留,并且可以使用更好的语法重写上面的内容:

代码语言:javascript
复制
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'

请参见PEP 468 – Preserving Keyword Argument Order.

PEP 468 -保留关键字参数顺.。

如果您的输入是以JSON形式给出的,那么为了保持顺序(为了获取OrderedDict),你可以通过object_pair_hook由@Fred Yankowski建议

代码语言:javascript
复制
>>> json.loads('{"a": 1, "b": 2}', object_pairs_hook=OrderedDict)
OrderedDict([('a', 1), ('b', 2)])
>>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
OrderedDict([('b', 2), ('a', 1)])
票数 277
EN

Stack Overflow用户

发布于 2012-06-01 12:55:42

正如其他人所提到的,潜在的判决是无序的。但是,python中也有OrderedDict对象。(它们是在最近的蟒蛇中内置的,或者您可以使用以下代码:http://code.activestate.com/recipes/576693/)。

我相信较新的pythons json实现可以正确处理内置的OrderedDicts,但我不确定(而且我无法轻松访问测试)。

旧的python simplejson实现不能很好地处理OrderedDict对象。并在输出之前将其转换为常规字典。但您可以通过执行以下操作来克服此问题:

代码语言:javascript
复制
class OrderedJsonEncoder( simplejson.JSONEncoder ):
   def encode(self,o):
      if isinstance(o,OrderedDict.OrderedDict):
         return "{" + ",".join( [ self.encode(k)+":"+self.encode(v) for (k,v) in o.iteritems() ] ) + "}"
      else:
         return simplejson.JSONEncoder.encode(self, o)

现在使用这个,我们得到:

代码语言:javascript
复制
>>> import OrderedDict
>>> unordered={"id":123,"name":"a_name","timezone":"tz"}
>>> ordered = OrderedDict.OrderedDict( [("id",123), ("name","a_name"), ("timezone","tz")] )
>>> e = OrderedJsonEncoder()
>>> print e.encode( unordered )
{"timezone": "tz", "id": 123, "name": "a_name"}
>>> print e.encode( ordered )
{"id":123,"name":"a_name","timezone":"tz"}

这和我们想要的差不多。

另一种选择是指定编码器直接使用你的row类,这样你就不需要任何中间的dict或UnorderedDict了。

票数 22
EN

Stack Overflow用户

发布于 2019-07-20 02:20:52

嘿,我知道现在回答这个问题太晚了,但是添加排序_键,并为其指定false,如下所示:

代码语言:javascript
复制
json.dumps({'****': ***},sort_keys=False)

这对我很有效

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10844064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档