如果可能,如何将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数组
如果可能的话,我想知道是否有任何方法可以轻松地将Pythondict
序列化为JSONlist
。如果可能,我的意思是如果键从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())