如果可能,如何将Python dict转换为JSON作为列表

如果可能,如何将Python dict转换为JSON作为列表,python,json,Python,Json,我正在尝试使用JSON.dumps将Python对象序列化为JSON。如果使用json.dumps序列化dict,它显然会被序列化为json字典{..};如果序列化列表或元组,它将是一个JSON数组 如果可能的话,我想知道是否有任何方法可以轻松地将Pythondict序列化为JSONlist。如果可能,我的意思是如果键从0开始并按顺序排列,例如: {0:'data',1:'data',2:'data} 上述内容将被序列化为JSON:'{“0”:“data”,“1”:“data”,“2”:“da

我正在尝试使用
JSON.dumps
将Python对象序列化为JSON。如果使用
json.dumps
序列化
dict
,它显然会被序列化为json字典
{..}
;如果序列化
列表
元组
,它将是一个JSON数组

如果可能的话,我想知道是否有任何方法可以轻松地将Python
dict
序列化为JSON
list
。如果可能,我的意思是如果键从0开始并按顺序排列,例如:

{0:'data',1:'data',2:'data}
上述内容将被序列化为JSON:
'{“0”:“data”,“1”:“data”,“2”:“data”}
,但我希望它被序列化为
['data','data','data']
,因为键从0开始并排序

我的理由是,我有很多从PHP序列化的JSON数据,PHP数组中有键,如果键按上述顺序排列,PHP的
JSON.encode
使用数组,如果它们以任何其他方式设置键,它们将序列化为JSON字典。我希望JSON序列化与PHP和Python代码都匹配。不幸的是,在我的例子中,更改PHP代码不是一个选项

有什么建议吗?我找到的唯一解决方案是编写自己的函数来检查和验证每个python字典,看看它是否可以首先转换为
列表
,然后再转换为
json.dumps


编辑:我序列化的对象可以是
列表
目录
,也可以在其中包含其他目录和列表,等等(嵌套)。我想知道是否有任何“简单”的方法可以做到这一点,否则我相信我可以自己编写一个递归解决方案。但最好使用现有代码来避免更多的bug。

您可以将字典转换为元组列表,然后对其进行排序,因为字典项不一定按您希望的顺序出现:

items = sorted(d.items(), key=lambda item: item[0])
values = [item[1] for item in items]
json_dict = json.dumps(values)

通常,您可以子类化
json.jsonecoder
来创建自己的自定义json序列化程序,但这不允许您覆盖内置对象类型

如果您创建自己的自定义
dictlist
对象(或您想调用的任何对象),而该对象不扩展
dict
list
,您应该能够覆盖
jsonecoder.default
方法来创建自己的自定义JSON序列化程序

无论您是创建自定义JSON序列化程序还是用列表递归替换特殊的
dict
实例,您都需要一个函数,该函数接受
dict
,并根据需要返回
list
dict

下面是一个实现:

def convert_to_list(obj):
    obj_list = []
    for i in range(len(obj)):
        if i not in obj:
            return obj  # Return original dict if not an ordered list
        obj_list.append(obj[i])
    return obj_list

我不知道没有递归的解决方案。。。尽管您可以从自定义
编码器的
encode
方法内部调用转换器,但这只会增加不必要的复杂性

In [1]: import json

In [2]: d = {"0": "data0", "1": "data1", "2": {"0": "data0", "1": "data1", "2": "data2"}}

In [3]: def convert(obj):
   ...:     if isinstance(obj, (list, tuple)):
   ...:         return [convert(i) for i in obj]
   ...:     elif isinstance(obj, dict):
   ...:         _, values = zip(*sorted(obj.items()))  
   ...:         return convert(values)
   ...:     return obj

In [4]: json.dumps(convert(d))
Out[4]: '["data0", "data1", ["data0", "data1", "data2"]]'

我不确定
dict.values()
是否能在py3k中工作。此外,FWIW、dict不是有序数据类型,因此序列化列表的顺序将是定义良好的,但“任意”的,即使您执行
json.dumps(list(dict.values())