当前位置: 首页 > 知识库问答 >
问题:

JSON对象中的项在使用“JSON.dumps”时出现顺序错误?

钱志强
2023-03-14

我正在使用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,名称,时区-但我有时区,id,名称。

我该怎么解决这个问题?

共有3个答案

单于亮
2023-03-14

嘿,我知道这个答案已经很晚了,但是添加sort_keys并分配false如下:

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

这对我有用

田文景
2023-03-14

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

我相信较新的pythons json实现可以正确地处理内置的OrderedDits,但是我不确定(并且我不容易访问测试)。

旧的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。

马欣荣
2023-03-14

Pythondict(在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}'

如果您需要特殊订单;您可以使用集合。订购信息技术

>>> 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–保留关键字参数顺序。

如果您的输入以JSON形式给出,那么为了保持顺序(获取OrderedDict),您可以传递object\u pair\u 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)])
 类似资料:
  • 问题内容: 我用来转换成json之类的 我得到的结果是: 我想按以下顺序获取键:ID,名称,时区-但我却拥有时区,ID,名称。 我该如何解决? 问题答案: Python (在Python 3.7之前)和JSON对象都是无序集合。您可以传递参数来对键进行排序: 如果您需要特定的订单;您可以使用: 从Python3.6开始,关键字参数顺序得以保留,并且可以使用更好的语法重写以上内容: 请参阅PEP 4

  • 问题内容: 我的python列表中有以下字符串(来自命令提示符): 进一步将默认编码也更改为utf-16。但是仍然抛出异常如下: 无法确定此类字符串需要哪种转换才能正常工作。 问题答案: 无法使用utf-8,utf-16编码进行解码。 尝试latin-1编码: 或者,指定,以使其不尝试解码字符串。

  • 问题内容: 我正在使用 ObjectMapper 进行java-json映射。 这是我的java类: 这就是我得到的: 所以我现在的问题是,如何获得此json输出: 我想要它与我的Java声明中的顺序相同。有没有办法指定它?也许带有注释或类似的东西? 问题答案:

  • 我正在使用ObjectMapper进行java-json映射。 这是我的java类: 这就是我得到的: 我希望它的顺序与java声明中的顺序相同。有办法指定吗?也许有注释之类的东西?

  • 我一直在尝试使用Gson将EMF(Eclipse建模框架)模型对象序列化到Json。然而,我遇到了堆栈溢出错误,当类的包含属性设置为true时,这种错误似乎会发生。他们在EMF模型上使用GSON有任何已知的限制吗? 下面链接的是我尝试序列化的(相当简单的)EMF 模型。请注意,如果我将 Chip 中“子块”的包含属性设为 false(在这种情况下,JSON 会正确生成),则不会发生错误: 我的EM

  • 问题内容: 我正在使用json模块创建一个包含类似条目的文件 但是,在创建的-file文件中,字段顺序错误 这是一个问题,因为-strings的替换现在不正确。 如何强制功能保持给定顺序? 问题答案: 像其他答案正确指出的那样,在Python 3.6之前,字典是 无序的 。 就是说,JSON还应该具有 _无序_映射,因此原则上在JSON中存储有序字典没有多大意义。具体来说,这意味着在读取JSON对