3

私は Python クラスと JSON の初心者であり、正しい方向に進んでいるかどうか確信が持てません。

基本的に、次のような POST 本文で JSON 要求を受け入れる Web サービスがあります。

{ "item" : 
     {
     "thing" : "foo",
     "flag" : true,
     "language" : "en_us"
     },
   "numresults" : 3
}

次のような「アイテム」のクラスを作成するルートをたどり始めました。

class Item(object):
    def __init__:
        self.name = "item"

    @property
    def thing(self):
        return self.thing

    @thing.setter
    def thing(self, value):
        self.thing = value

    ...

だから、私の質問は次のとおりです。

  1. 私は正しい方向に進んでいますか?
  2. Python オブジェクトを JSON 文字列に変換するにはどうすればよいですか?

Python で JSON に関する多くの情報を見つけました。jsonpickle を見てきましたが、必要なネストされた辞書を最終​​的に出力するクラスを作成できないようです。

編集:ジョランの提案のおかげで、私はプロパティを使用するクラスに固執し、次のようなメソッドを追加しました:

    def jsonify(self):
        return json.dumps({ "item" :  self.__dict__ }, indent=4)

そしてそれは完璧に機能しました。

助けてくれてありがとう。

4

3 に答える 3

1

colanderプロジェクトを見てください。JSON との間で簡単にシリアル化できるオブジェクト指向の「スキーマ」を定義できます。

import colander

class Item(colander.MappingSchema):
    thing = colander.SchemaNode(colander.String(),
                                validator=colander.OneOf(['foo', 'bar']))
    flag = colander.SchemaNode(colander.Boolean())
    language = colander.SchemaNode(colander.String()
                                   validator=colander.OneOf(supported_languages)

class Items(colander.SequenceSchema):
    item = Item()

次に、これらを JSON からロードします。

items = Items().deserialize(json.loads(jsondata))

データをcolander検証し、一連の python オブジェクトを返します。これを処理できます。

または、特定のオブジェクトごとの処理を作成して、Python オブジェクトを JSON 構造に、またはその逆に変換できるようにする必要があります。

于 2012-09-24T16:46:07.887 に答える
1

辞書を返すメソッドをクラスに 1 つ追加するだけです

def jsonify(self):
    return { 'Class Whatever':{
              'data1':self.data1,
               'data2':self.data2,
               ...
                               }

     }

結果でtojson関数を呼び出します...または、戻る前に呼び出して、json結果を返すだけです...

于 2012-09-24T16:47:08.480 に答える
0

水切りと口述の提案はどちらも素晴らしいです。

少し立ち止まって、これらのオブジェクトをどのように使用するかを決定する必要があることを付け加えておきます。
この一般的なアプローチの潜在的な問題は、どの属性をエクスポートするかを決定するために、リストや関数、またはその他のマッピングが必要になることです。(これは、colander 定義と jsonify 定義で確認できます)。

この動作が必要な場合もあれば、そうでない場合もあります。

たとえば、sqlalchemy プロジェクトには、フィールド名で定義されたクラスがあり、ion colander のような特性があります。 ただし、オブジェクト自体には、データベースとデータベース接続に関連する多くの補助データが格納されています。

関心のある基礎となるフィールドデータだけを取得するには、データをラップするプライベート内部辞書にアクセスするか、マップされた列のクラスをクエリする必要があります。

def columns_as_dict(self):
    return dict((col.name, getattr(self, col.name)) for col in sqlalchemy_orm.class_mapper(self.__class__).mapped_table.c)

これを過度に複雑にするつもりはありません。これらのオブジェクトをどのように使用する可能性があるかを正確に考えるよう提案したいだけです。オブジェクトに入れたものと同じ情報だけをオブジェクトから取り出したい場合は、単純な解決策で十分です。しかし、これらのオブジェクトが他の種類の「プライベート」データを持つ場合は、さまざまな種類の情報を区別する必要があるかもしれません。

于 2012-09-24T17:11:42.773 に答える