私はPythonからRにデータを送るためにJSONを使用しています(注:私はPythonよりもRに慣れています)。プリミティブの場合、json
モジュールはうまく機能します。他の多くのPythonオブジェクト(numpy
配列など)では、stack overflow answerのようにカスタムエンコーダを定義する必要があります。しかし、それはjson.dumps
への引数としてエンコーダを渡す必要がありますが、私の場合はうまくいきません。 json_tricks
のような、JSONシリアライゼーションのはるかに高度な機能を備えているパッケージがあることは知っていますが、Pythonディストリビューションを管理することはできないため、オブジェクトをシリアル化するためにデフォルト以外のモジュールを使用したくないJSONへJSONシリアライズへのデコレータアプローチ
のデコレータを使用してJSONオブジェクトをシリアライズする追加の方法を定義する方法があるのだろうかと思います。理想的には、ユーザーがstandard_wrapper
を変更することなく、独自のクラス(またはロードするモジュールのタイプ)の新しいメソッドを追加するために用意した標準関数standard_wrapper
をオーバーライドできる方法を探しています。以下のいくつかの擬似コード:
import json
def standard_wrapper(o):
return o
obj = [44,64,13,4,79,2,454,89,0]
json.dumps(obj)
json.dumps(standard_wrapper(obj))
import numpy as np
objnp = np.sort(obj)
json.dumps(objnp) # FAILS
@some_decorator_to_overload_standard_wrapper
# some code
json.dumps(standard_wrapper(objnp)) # HOPEFULLY WORKS
これは、本質的にタイプによって過負荷に機能ですが---私はPythonでoverloading by argumentsの例を見てきましたが、私はタイプによってどのようにそれを行うには表示されません。
EDIT私はcontextlib
(デコレータを使用したことがあります)のデコレータを混ぜていました。
「contextlib」を使ってこのことを思い出しているのは私の謎です。何を思い浮かべましたか?それにもかかわらず、[** _オブジェクトJSONを通常のエンコーダでシリアライズすること**](https://stackoverflow.com/questions/18478287/making-object-json-serializable-with-regular-encoder)の回答は役に立ちます。 – martineau
私はカスタムクラスのエンコーダを作成したくないので、既存のメソッドと競合しないカスタムの 'cls'オブジェクトを直列化するための独自のメソッドをユーザが定義できるようにするフレームワークが必要です。 'json.dumps'の引数です。私はRのS3メソッドに相当するPythonを探していると思います。 – mikeck
リンクされた質問に対する私の答えを読んでいるように私には聞こえません。これは、jsonエンコーディングスキームにフックして、必要な処理を実行する方法を示しています。このコードでは、何もせずに多くの一般的なPython型をシリアライズすることができるので、 'pickle'を例として使用しています。これは拡張可能なシステムなので、多くの著者がクラスに対応するためのメソッドを追加しています。ユーザーが提供する "メソッド"を使って独自の "フレームワーク"を作るのはかなり簡単だと思いますが、そうすることで、適切なオブジェクトに関連付ける方法が必要になります。これを行う – martineau