Python JSON对象中的项在使用";json.dumps“;?

Python JSON对象中的项在使用";json.dumps“;?,python,json,Python,Json,我正在使用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"}, {"timezo

我正在使用
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


我该如何解决这个问题

在JSON中,就像在Javascript中一样,对象键的顺序是没有意义的,所以不管它们以什么顺序显示,都是同一个对象。

在JSON中,就像在Javascript中一样,对象键的顺序是没有意义的,所以不管它们以什么顺序显示,它是同一个对象。

字典的顺序与其定义的顺序没有任何关系。这适用于所有字典,而不仅仅是那些转换为JSON的字典

>>> {"b": 1, "a": 2}
{'a': 2, 'b': 1}
事实上,字典在到达json.dumps之前就已经“颠倒”了:

>>> {"id":1,"name":"David","timezone":3}
{'timezone': 3, 'id': 1, 'name': 'David'}

字典的顺序与它在中定义的顺序没有任何关系。这适用于所有字典,而不仅仅是那些转换为JSON的字典

>>> {"b": 1, "a": 2}
{'a': 2, 'b': 1}
事实上,字典在到达json.dumps之前就已经“颠倒”了:

>>> {"id":1,"name":"David","timezone":3}
{'timezone': 3, 'id': 1, 'name': 'David'}

正如其他人所提到的,基本指令是无序的。但是,python中有OrderedDict对象。(它们是在最近的Python中内置的,或者您可以使用此:)

我相信较新的pythonsjson实现可以正确处理内置的OrderedDicts,但我不确定(而且我也不容易进行测试)

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

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或无序dict。

正如其他人提到的,底层dict是无序的。但是,python中有OrderedDict对象。(它们是在最近的Python中内置的,或者您可以使用此:)

我相信较新的pythonsjson实现可以正确处理内置的OrderedDicts,但我不确定(而且我也不容易进行测试)

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

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或无序dict。

Python
dict
(在Python 3.7之前)和JSON对象都是无序集合。您可以传递
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}'
如果您需要特殊订单;你可以:

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

>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'

如果您的输入是以JSON形式提供的,那么为了保持顺序(获取
OrderedDict
),您可以传递
object\u pair\u hook
,:


Python
dict
(在Python 3.7之前)和JSON对象都是无序集合。您可以传递
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}'
如果您需要特殊订单;你可以:

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

>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'

如果您的输入是以JSON形式提供的,那么为了保持顺序(获取
OrderedDict
),您可以传递
object\u pair\u hook
,:

json.dump()将保留字典的顺序。在文本编辑器中打开文件,您将看到。无论您是否发送OrderedICT,它都将保留订单

但是json.load()将丢失保存的对象的顺序,除非您告诉它加载到OrderedDict(),这是使用上面J.F.Sebastian指示的object\u pairs\u hook参数完成的

否则它将丢失顺序,因为在通常的操作中,它将保存的dictionary对象加载到常规dict中,而常规dict不会保留给定项的顺序。

json.dump()将保留字典的顺序。在文本编辑器中打开文件,您将看到。无论您是否发送OrderedICT,它都将保留订单

但是json.load()将丢失保存的对象的顺序,除非您告诉它加载到OrderedDict(),这是使用上面J.F.Sebastian指示的object\u pairs\u hook参数完成的


否则它将丢失顺序,因为在通常的操作下,它将保存的dictionary对象加载到常规dict中,而常规dict不会保留给定项的顺序。

嘿,我知道回答这个问题已经太晚了,但添加排序键并按如下方式为其分配false:

json.dumps({'****': ***},sort_keys=False)

这对我来说很有效

嘿,我知道回答这个问题已经太晚了,但是添加排序键并按如下方式将其赋值为false:

json.dumps({'****': ***},sort_keys=False)
这对我很有用

Python 3.6.1:

Python 3.6.1 (default, Oct 10 2020, 20:16:48)
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import json
>>> json.dumps({'b': 1, 'a': 2})
'{"b": 1, "a": 2}'
Python 2.7.5:

Python 2.7.5 (default, Nov 20 2015, 02:00:19) 
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.

>>> import json
>>> json.dumps({'b': 1, 'a': 2})
'{"a": 2, "b": 1}'
Python 3.6.1:

Python 3.6.1 (default, Oct 10 2020, 20:16:48)
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import json
>>> json.dumps({'b': 1, 'a': 2})
'{"b": 1, "a": 2}'
Python 2.7.5:

Python 2.7.5 (default, Nov 20 2015, 02:00:19) 
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.

>>> import json
>>> json.dumps({'b': 1, 'a': 2})
'{"a": 2, "b": 1}'

如果您使用的是Python3.7+,它确实会保持顺序

在Python3.7之前,dict不保证是有序的,因此输入和输出通常是加扰的,除非 collections.OrderedDict是专门要求的。从 Python3.7中,常规的dict变成了保序的,因此它不是 不再需要为JSON指定collections.OrderedDict 生成和解析


如果您使用的是Python 3.7+,它确实会保留顺序

在Python3.7之前,dict不保证是有序的,因此输入和输出通常是加扰的,除非 collections.OrderedDict是专门要求的。从 Python3.7中,常规的dict变成了保序的,因此它不是 不再需要为JSON指定collections.OrderedDict 生成和解析

(同样