5

を使用して、Python オブジェクトを JSON にシリアル化しようとしていますjson.dumpsdictusingをシリアライズするjson.dumpsと、明らかに JSON ディクショナリとしてシリアライズされます{..}listaまたは aをシリアル化tupleすると、JSON 配列になります。

dict可能であれば、Pythonを JSON として簡単にシリアル化する方法があるかどうかを知りたいですlist。可能であれば、キーが 0 から始まり、順序付けされているかどうかを意味します。たとえば、次のようになります。

{0:'data',1:'data',2:'data}

上記は JSON に as: としてシリアル化されますが、キーは 0 から始まり、順序付けられているため、 as: としてシリアル化し'{"0": "data", "1": "data", "2": "data"}'たいと思います。['data','data','data']

これについての私の理由は、PHP からシリアル化された JSON データがたくさんあるためです。PHP 配列にはキーがあり、キーが上記のようにjson.encode順序付けられている場合、PHP は配列を使用し、他の方法でキーが付けられている場合はシリアル化されます。 JSON辞書として。PHP と Python の両方のコードで、JSON シリアライゼーションを一致させたいと考えています。残念ながら、私の場合、PHP コードを変更することはできません。

助言がありますか?list私が見つけた唯一の解決策は、独自の関数を作成して、各 python 辞書を調べて検証し、最初にbeforeに変換できるかどうかを確認することjson.dumpsです。

EDIT :私がシリアライズしているこのオブジェクトは、 alistまたは adictである可能性があり、その中に追加のディクテーションやリストなどを含めることができます(ネスト)。これを行う「簡単な」方法があるかどうか疑問に思っています。そうでない場合は、自分で再帰的なソリューションを作成できると思います。しかし、より多くのバグを避けるために、既存のコードを使用する方が常に優れています。

4

3 に答える 3

2

ディクショナリをタプルのリストに変換してから並べ替えることができます。これは、ディクショナリ アイテムが必ずしも希望どおりの順序で表示されるとは限らないためです。

items = sorted(d.items(), key=lambda item: item[0])
values = [item[1] for item in items]
json_dict = json.dumps(values)
于 2013-04-14T06:09:21.957 に答える
2

再帰のない解決策はわかりません... encodecustom のメソッド内からコンバーターを呼び出すことはできますが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"]]'
于 2013-04-14T08:32:44.523 に答える