Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python JSON对象中的项在使用";json.dumps“;?_Python_Json - Fatal编程技术网

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的字典

>>> {"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。

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不会保留给定项的顺序。

嘿,我知道回答这个问题已经太晚了,但添加排序键并按如下方式为其分配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}'

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

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


(对于标准Python
dict
)也是如此,但由于JSON在解析之前是字符串表示,因此字符串比较(如doctests)可能仍然需要顺序。所以我不认为这一点无关紧要。虽然Javascript(ECMA脚本)标准确实如此,但所有实现都将(字符串)键保持在源代码顺序上。@Paulpro真的吗?哪一个?我知道Chrome曾经尝试过遵循这里的标准,但最终还是屈服了()。我不认为有人会在那之后尝试同样的事情…@paulpro你正确地回答了OP的问题。然而,我想补充一点,维护秩序是有合法用途的。例如,可以编写一个脚本,读取JSON,应用一些转换,并写回结果。您可能希望保留顺序,以便diff工具能够清楚地显示更改;JSON客户机可以读取对象定义,完全忽略键的顺序,完全符合RFC。Martijn是正确的,这不会影响RFC符合性,但如果您希望JSON具有一致的格式,它肯定仍然很有价值(例如,如果文件处于版本控制之下,或者为了便于读者理解,或者为了使条目顺序与您的文档相匹配。)在这种情况下,您只需在调用
json.dumps()
时将
排序键设置为
True
;以确保顺序稳定性(用于测试、稳定缓存或VCS提交),排序键就足够了。OrderedDict的init真的ugly@jean:初始值与
orderedict()
无关,您可以将
dict
传递给
orderedict()
,您可以将有序对列表传递给
dict())
也一样——虽然在这两种情况下顺序都会丢失。我的意思是在保留顺序时初始化它,需要键入许多“(”和“)@jean:如果使用
d=JSON.load(f,object\u pairs\u hook=OrderedDict)加载JSON,也会有(alpha-quality)
,稍后的
JSON.dump(d)
将保留原始元素的顺序。这实际上是一个更好的修复方法,因为在加载时维护顺序会考虑转储时间顺序。感谢您的回答。太好了!谢谢!
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 (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}'