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

5 python json

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

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

{0:'data',1:'data',2:'data}
Run Code Online (Sandbox Code Playgroud)

上面将序列化为JSON为:'{"0": "data", "1": "data", "2": "data"}',但我希望它被序列化,['data','data','data']因为键从0开始并按顺序排列.

我的理由是因为我有许多从PHP序列化的JSON数据,其中PHP数组中有密钥,如果密钥按上述顺序排序,PHP json.encode使用数组,如果它们以任何其他方式键入,则它们被序列化作为JSON词典.我希望我的JSON序列化能够匹配我的PHP和Python代码.不幸的是,在我的情况下,更改PHP代码不是一个选项.

有什么建议?我找到的唯一解决方案是编写自己的函数来验证每个python字典并查看它是否可以先转换为list之前的字典json.dumps.

编辑:我正在序列化的这个对象可以是a list或a dict,它可以在其中包含额外的dicts,列表等等(嵌套).我想知道是否有任何'简单'的方法可以做到这一点,否则我相信我自己可以写一个递归的解决方案.但是使用现有代码以避免更多错误总是更好.

roo*_*oot 2

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

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"]]'
Run Code Online (Sandbox Code Playgroud)