2016-08-25 11 views
1

書き込みAPIは、私は多くの場合、これは、これはより多くのrepetetiveとエラーが発生しやすくなるネストのすべての層でPythonでJSONのネストされたクラスを初期化しますか?

class Nested1: 
    @classmethod 
    def from_json(json): 
     self.nested2=Nested2.from_json(json.nested2) 

のカスケードにつながる私のコードでは、この

# When my API receives such a ... 
n_json = {"nested1": {"nested2" : { "nested3" : "..." }}} 

# .. I need to instantiate a proper object out of it ... 
nested1 = Nested1.from_json(json.loads(n_json)) 

# ... so I can later use the instance in OOP style. 
nested1.nested2.run_an_intance_method() 

のようなネストされたJSONsからクラスを初期化する必要があります。これを行うための任意の巧妙な方法?

+0

、(値でselfを置き換える)、自己に値を割り当てていないが、実際の例を示しています。あなたが何をしようとしているのか理解していない。 – Daniel

+0

@Daniel Clearer?それでも正しいバランスを見つけようとしている。 [この記事で](http://stackoverflow.com/questions/39097411/how-to-reduce-boilerplate-when-initializating-classes-from-jsons-in-python-3-5)私はこのための私の動機を説明した疑問がありますが、あまりにも長い/敬意を表します;) –

答えて

1

これは、JSONからネストされたオブジェクトを作成する方法です(PHPと同じように)。

class Nested: 
    def __new__(cls, structure): 
     self = super(Nested, cls).__new__(cls) 
     if type(structure) is dict: 
      self.__dict__ = {key: Nested(structure[key]) for key in structure} 
     elif type(structure) is list: 
      self = [Nested(item) for item in structure] 
     else: 
      self = structure 
     return self 

とあなた解析されたJSONからそれを呼び出す:JSONからオブジェクトツリーを作成するには、次のクラスを記述し(むしろ、単にPythonの構造であるJSONは、解析されました)。例:ここでは

import json 

s = json.dumps({'a': 1, 'b': {'c': [1, 2, {'d': 3}], 'e': {'f': 'g'}}}) 

result = Nested(json.loads(s)) 

print(result.a) # 1 

print(result.b.c) # [1, 2, <__main__.Nested object at 0x00000297A983D828>] 

print(result.b.c[0]) # 1 

print(result.b.c[2].d) # 3 

は、クラスがどのように働くかは何かということです:

  1. __new__何か他のものの前に呼び出されます。ここでは、新しいがリストの場合Nested({'a': [1, 2, 3]).a

    (また、単に[1, 2, 3]、数4を参照してください等しい)[Nested(1), Nested(2), Nested(3)]に等しくなるように、私たちは、ネストされたオブジェクトのリストで自己を交換

  2. (空の)オブジェクトのインスタンスを作成します

  3. 新しいものがdictの場合、各キーについて同じ名前のプロパティを作成し、Nested(dict[key])を割り当てます。他のタイプの場合

  4. Nested({'a': ['b', 'c', 'd']}).a[0]'b'に等しくなるようにちょうどNested(..)

+0

Thxは、同様のことをしている私のコードよりも上手に見えます:) Nested1とNested2がインスタンスメソッドなどで異なるクラスを強調するように質問を強化しました。 。どのようにそれを組み込むことができる任意のアイデアですか? (または、これを試してはいけない...) –

+1

@IwanLDあなたは本当にすべきではありません、この時点であなたは非常にハッキーなことをしようとしています。 JSONを使用してネストされた異なるクラスを格納する必要がある場合は、to_jsonとfrom_jsonをそれぞれ定義する必要があります。 –

+0

はい、私はそれが高すぎるかもしれないと感じています。しかし、 '' self .__ dict__ 'を使うことは、このように見ることができます。いつものように:それは依存しています。現在の状況:JSONからネストされたオブジェクト指向のDSLを生成したい。私はAPIの中のほとんどのクラスはちょうどネストされたDatastructures +メソッドであると思いました。データ構造の定型文を重要な部分、つまり署名だけに減らしてみませんか? –

関連する問題