[解決済み] Pythonのnamedtupleをjsonにシリアライズする
質問
をシリアライズする推奨される方法は何ですか?
namedtuple
をフィールド名を保持したままjsonにシリアライズする推奨される方法は何ですか?
をシリアライズすると
namedtuple
をjsonにシリアライズすると、値だけがシリアライズされ、フィールド名は翻訳中に失われてしまいます。json化してもフィールドは残しておきたいので、以下のようにしました。
class foobar(namedtuple('f', 'foo, bar')):
__slots__ = ()
def __iter__(self):
yield self._asdict()
上記は期待通りにjsonにシリアライズされ、以下のような挙動をします。
namedtuple
として動作します(私のユースケースには問題ありません)。
フィールド名を保持したままjsonに変換するquot;正しい方法"とは何でしょうか?
どのように解決するのですか?
これはかなり厄介です。
namedtuple()
から派生した新しい型を返すファクトリだからです。
tuple
. 一つのアプローチとして、あなたのクラスもまた
UserDict.DictMixin
を継承させることもできますが
tuple.__getitem__
は既に定義されており、その属性名ではなく、要素の位置を示す整数を期待します。
>>> f = foobar('a', 1)
>>> f[0]
'a'
名前付きタプルはJSONに適合する奇妙なもので、それは実際には
カスタムビルドタイプで、キー名はタイプ定義の一部として固定されています。
というのも、キー名がインスタンス内部に格納される辞書とは異なり、キー名が型定義の一部として固定されるカスタムビルドタイプだからです。 このため、namedtupleをラウンドトリップすることができません。たとえば、dictにアプリケーション固有の型マーカーなどの情報がないと、dictionaryをnamedtupleにデコードして戻すことはできません。
{'a': 1, '#_type': 'foobar'}
のような他の情報がなければ、辞書を名前付きタプルにデコードして戻すことはできません。
これは理想的ではありませんが
をエンコードする必要があるだけなら
という名前のタプルを辞書にエンコードする必要がある場合、別のアプローチは、これらのタイプを特殊化するためにJSONエンコーダを拡張または修正することです。 以下は、Pythonの
json.JSONEncoder
. これは、ネストされた名前付きタプルが適切に辞書に変換されることを保証する問題に取り組んでいます。
from collections import namedtuple
from json import JSONEncoder
class MyEncoder(JSONEncoder):
def _iterencode(self, obj, markers=None):
if isinstance(obj, tuple) and hasattr(obj, '_asdict'):
gen = self._iterencode_dict(obj._asdict(), markers)
else:
gen = JSONEncoder._iterencode(self, obj, markers)
for chunk in gen:
yield chunk
class foobar(namedtuple('f', 'foo, bar')):
pass
enc = MyEncoder()
for obj in (foobar('a', 1), ('a', 1), {'outer': foobar('x', 'y')}):
print enc.encode(obj)
{"foo": "a", "bar": 1}
["a", 1]
{"outer": {"foo": "x", "bar": "y"}}
関連
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] Django filter queryset __in for *every* item in list