【发布时间】:2014-07-27 10:17:31
【问题描述】:
我有以下问题:有一个如下的 python 字典:
{"qqq": [{"bbb": "111"}, {"aaa": "333"}], "zzz": {"bbb": [5, 2, 1, 9]}}
我想获取一个有序的json对象比如:
'{"qqq": [{"aaa": "333"}, {"bbb": "111"}], "zzz": {"bbb": [1, 2, 5, 9]}}'
目前我使用以下内容:
class ListEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, list):
return sorted(o)
return json.JSONEncoder.default(self, o)
print json.dumps(c, sort_keys=True, cls=ListEncoder)
但是我的对象内的两个列表没有排序,我得到:
'{"qqq": [{"bbb": "111"}, {"aaa": "333"}], "zzz": {"bbb": [5, 2, 1, 9]}}'
可能是因为自定义的 JSONEncoder 跳过了一个已经知道如何管理的类型(列表)。
更新
下面的Martijn解决方案非常适合上面的例子,但不幸的是我必须管理更复杂的字典,深度更大:例如以下两个
a = {
'aaa': 'aaa',
'op': 'ccc',
'oppa': {
'ggg': [{'fff': 'ev'}],
'flt': {
'nnn': [
{
'mmm': [{'a_b_d': [6]},{'a_b_c': [6,7]}]
},
{
'iii': [3, 2, 4, 5]
}
]
}
},
'rrr': {},
'ttt': ['aaa-bbb-ccc']
}
b = {
'aaa': 'aaa',
'op': 'ccc',
'oppa': {
'ggg': [{'fff': 'ev'}],
'flt': {
'nnn': [
{
'iii': [2, 3, 4, 5]
},
{
'mmm': [{'a_b_c': [6,7]},{'a_b_d': [6]}]
}
]
}
},
'rrr': {},
'ttt': ['aaa-bbb-ccc']
}
如果对同一内部的列表进行排序,它们将是相同的。 但它们不在上面的类中,我得到了 2 个不同的 json 字符串:
{"aaa": "aaa", "op": "ccc", "oppa": {"flt": {"nnn": [{"iii": [3, 2, 4, 1]}, {"mmm": [{"a_b_d": [6]}, {"a_b_c": [6, 7]}]}]}, "ggg": [{"fff": "ev"}]}, "rrr": {}, "ttt": ["aaa-bbb-ccc"]}
{"aaa": "aaa", "op": "ccc", "oppa": {"flt": {"nnn": [{"iii": [2, 3, 4, 5]}, {"mmm": [{"a_b_c": [6, 7]}, {"a_b_d": [6]}]}]}, "ggg": [{"fff": "ev"}]}, "rrr": {}, "ttt": ["aaa-bbb-ccc"]}
有办法解决这个问题吗?
【问题讨论】:
标签: python json list dictionary