我正在使用json.dumps
转换为json,如
countries.append({"id":row.id,"name":row.name,"timezone":row.timezone})
print json.dumps(countries)
我得到的结果是:
[
{"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。
我该如何解决这个问题呢?
发布于 2014-05-23 11:14:58
两者都是Pythondict
( Python 3.7之前)和JSON object是无序集合。你可以通过sort_keys
参数,对键进行排序:
>>> 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:
使用
>>> 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开始
,关键字参数顺序被保留,并且可以使用更好的语法重写上面的内容:
>>> 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建议
>>> 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)])
发布于 2012-06-01 12:55:42
正如其他人所提到的,潜在的判决是无序的。但是,python中也有OrderedDict对象。(它们是在最近的蟒蛇中内置的,或者您可以使用以下代码:http://code.activestate.com/recipes/576693/)。
我相信较新的pythons json实现可以正确处理内置的OrderedDicts,但我不确定(而且我无法轻松访问测试)。
旧的python simplejson实现不能很好地处理OrderedDict对象。并在输出之前将其转换为常规字典。但您可以通过执行以下操作来克服此问题:
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)
现在使用这个,我们得到:
>>> 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了。
发布于 2019-07-20 02:20:52
嘿,我知道现在回答这个问题太晚了,但是添加排序_键,并为其指定false,如下所示:
json.dumps({'****': ***},sort_keys=False)
这对我很有效
https://stackoverflow.com/questions/10844064
复制相似问题