web-dev-qa-db-ja.com

Pythonを使用したJSONのオブジェクトのリスト

ObjectインスタンスをJSONに変換する際に問題があります:

ob = Object()

list_name = scaping_myObj(base_url, u, number_page)

for ob in list_name:
   json_string = json.dumps(ob.__dict__)
   print json_string

list_nameObjectインスタンスのリストがあります。

json_stringリターン、たとえば:

{"city": "rouen", "name": "1, 2, 3 Soleil"}
{"city": "rouen", "name": "Maman, les p'tits bateaux"}

ただし、リスト内のすべての情報を含むJSON文字列が1つだけ必要です。

[{"city": "rouen", "name": "1, 2, 3 Soleil"}, {"city": "rouen", "name": "Maman, les p'tits bateaux"}]
22
pedro

リスト内包表記を使用して辞書のリストを作成し、それを変換できます。

_json_string = json.dumps([ob.__dict__ for ob in list_name])
_

またはdefault関数を使用します。 json.dumps()は、シリアル化できないものに対して呼び出します:

_def obj_dict(obj):
    return obj.__dict__

json_string = json.dumps(list_name, default=obj_dict)
_

後者は、リストだけでなく、構造のあらゆるレベルで挿入されたオブジェクトに対して機能します。

66
Martijn Pieters

この問題の別の可能な解決策は jsonpickle です。これを使用して、任意のPythonオブジェクトをJSON(単なるリストだけでなく)に変換できます。

jsonpickleホームページから:

jsonpickleは、Python複雑な直列化および直列化復元のためのライブラリPython JSONとの間のオブジェクト。標準のPythonライブラリPythonは、Python JSONに相当するプリミティブ(辞書、リストなど) jsonpickleはこれらのライブラリの上に構築され、より複雑なデータ構造をJSONにシリアル化できます。jsonpickleは高度な設定と拡張が可能で、ユーザーはJSONバックエンドを選択して追加のバックエンドを追加できます。

変換の実行は簡単です。

import jsonpickle

class JsonTransformer(object):
    def transform(self, myObject):
        return jsonpickle.encode(myObject, unpicklable=False)
3
Steven Wolfe

@MartijnPietersの答えと同様に、別の関数を作成する必要がない場合は、json.dumps defaultパラメーターをラムダと共に使用できます:json.dumps(obj, default = lambda x: x.__dict__)

2
Eric Romrell