コレクションに重複が含まれないようにするために、メソッドとset
オブジェクトを含むPython があります。__hash__
__eq__
この結果をjsonでエンコードする必要がありset
ますset
が、json.dumps
メソッドにempty を渡すとaが発生しTypeError
ます。
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: set([]) is not JSON serializable
json.JSONEncoder
カスタムdefault
メソッドを持つクラスの拡張機能を作成できることはわかっていますが、からの変換をどこから始めればよいかさえわかりませんset
。set
デフォルトのメソッド内の値から辞書を作成し、そのエンコードを返す必要がありますか?理想的には、デフォルトのメソッドが、元のエンコーダーがチョークするすべてのデータ型を処理できるようにしたいと思います(Mongoをデータソースとして使用しているため、日付でもこのエラーが発生するようです)
正しい方向へのヒントがあれば幸いです。
編集:
答えてくれてありがとう!おそらくもっと正確だったはずだ。
私set
は翻訳の制限を回避するためにここで回答を利用(および賛成)しましたが、問題である内部キーもあります。
のオブジェクトは、にset
変換される複雑なオブジェクトです__dict__
が、jsonエンコーダーの基本タイプには適さない可能性のあるプロパティの値を含めることもできます。
このにはさまざまなタイプが多数set
あり、ハッシュは基本的にエンティティの一意のIDを計算しますが、NoSQLの真の精神では、子オブジェクトが何を含んでいるかを正確に伝えることはできません。
1つのオブジェクトにはの日付値が含まれる場合がありますが、starts
別のオブジェクトには、「非プリミティブ」オブジェクトを含むキーを含まない他のスキーマが含まれる場合があります。
そのため、考えられる唯一の解決策はJSONEncoder
、default
メソッドを置き換えてさまざまなケースをオンにするように拡張することでした。しかし、これに対処する方法がわからず、ドキュメントがあいまいです。ネストされたオブジェクトでは、default
キーから返される値はキーによるものですか、それともオブジェクト全体を参照する一般的なinclude / discardですか?そのメソッドはネストされた値にどのように対応しますか?私は以前の質問を調べましたが、ケース固有のエンコーディングへの最良のアプローチを見つけることができないようです(残念ながら、ここで行う必要があるように思われます)。
dict
ですか?私はあなたlist
がセットからちょうどそれを作り、それをエンコーダーに渡したいと思うと思います...例:encode(list(myset))