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_name
Object
インスタンスのリストがあります。
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"}]
リスト内包表記を使用して辞書のリストを作成し、それを変換できます。
_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)
_
後者は、リストだけでなく、構造のあらゆるレベルで挿入されたオブジェクトに対して機能します。
この問題の別の可能な解決策は 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)
@MartijnPietersの答えと同様に、別の関数を作成する必要がない場合は、json.dumps default
パラメーターをラムダと共に使用できます:json.dumps(obj, default = lambda x: x.__dict__)