シリアル化されるフィールドを制御するために、自然キーや依存関係などを使用したjsonシリアル化を調べました。また、ミドルウェアwodofstuffを使用して、より深い外部キーのシリアル化を可能にしてみました。ただし、JSON応答をレンダリングするためにテンプレートを使用することにしました。
いくつかの落とし穴は
- 私はJSONのフォーマットを担当しています(セミコロンがないなどの間違いが発生しやすい)
- 私はキャラクターをエスケープする責任があります
- buit-inシリアル化よりもレンダリングが遅くなりますか?
いくつかの利点は
- シリアル化されるものを制御できます(基になるモデルが変更された場合でも)
- JSONファイルで多対多または外部キーの関係をフォーマットできますが、好きです
TLDL; 私の場合、必要なJSONファイルの形式は非常にカスタムでした。辞書のリストに辞書がありました。一部のフィールドは反復的であるため、テンプレートにforループを使用してレンダリングします。ただし、この形式では、ディクショナリとは対照的に、反復オブジェクトの一部のフィールドをリストにカプセル化する必要があります。
これは、simplejsonを検討しているときに遭遇した障害でした。のようなものを使用することによって
import simplejson as json
def encode_complex(obj):
if isinstance(obj, complex):
return [obj.real, obj.imag]
raise TypeError(repr(o) + " is not JSON serializable")
json.dumps(2 + 1j, default=encode_complex)
'[2.0, 1.0]'
繰り返しデータを返すことができました。ただし、特定の反復をカプセル化するには、反復の反復とカスタムオブジェクトタイプ(listまたはdict)が必要でした。最後に(知識の欠如または忍耐力の欠如かもしれません)私はテンプレートでそれを行うことにしました。
テンプレートを介してレンダリングすることは、それを行うための最もスケーラブルまたは「最もスマートな」方法ではないように感じますが、おそらくより良い方法で行うことができますか?私が正しいか間違っているかを自由に証明してください。