2017-03-08 19 views
7

json-stringをpythonオブジェクトに変換する必要があります。オブジェクトによって、私は "新しい" python3オブジェクトを意味します:jsonをオブジェクトに変換するには?

class MyClass(object): 

たとえば、jsonpickleのドキュメントでいくつかのヘルプが見つかりました。しかし、私が見つけたのは、最初にオブジェクトをjsonに変換し、これを逆変換したチュートリアルです。

json-stringをRest-APIに変換したいとします。ここで

は、私がこれまでにやっていることです:

import requests 
import jsonpickle 

class Goal(object): 
    def __init__(self): 
     self.GoaldID = -1 
     self.IsPenalty = False 

class Match(object): 
    def __init__(self): 
     self.Goals = [] 

headers = { 
    "Content-Type": "application/json; charset=utf-8" 
} 

url = "https://www.openligadb.de/api/getmatchdata/39738" 

result = requests.get(url=url, headers=headers) 
obj = jsonpickle.decode(result.json) 
print (obj) 

これは、その結果:それはjsonpickleは私のクラス(ゴール、試合にこれを変換することができない私にはかなり明確だ

TypeError: the JSON object must be str, bytes or bytearray, not 'method' 

)、私はjsonpickleに出力を変換するクラスを教えていないからです。問題は、オブジェクトのJSONを型一致から変換するようにjsonpickleに指示する方法がわからないことです。そして、目標のリストはタイプList<Goal>でなければならないと私はどのように伝えることができますか?上記の

obj = jsonpickle.decode(result.content) # NOTE: `.content`, not `.json` 

obj = result.json() 

しかし、どれもあなたが欲しいものを()(dicitonaryないPythonオブジェクト)を得ません。

+0

'OBJ = jsonpickle.decode(result.content)は、' =>これは、あなたの辞書を提供します。 – falsetru

+0

'obj = result.json()'も辞書を提供します。 – falsetru

答えて

6

次の行は、あなたの辞書を提供します。 URLからJSONをjsonpickle.encodeでエンコードされていないため、 - 生成されたJSONに情報を追加whcih({"py/object": "__main__.Goal", ....}のようなもの)を使用すると、辞書ではありません、実際のP​​ythonオブジェクトを使用する場合は


>>> import jsonpickle 
>>> class Goal(object): 
...  def __init__(self): 
...   self.GoaldID = -1 
...   self.IsPenalty = False 
... 
>>> jsonpickle.encode(Goal()) 
'{"py/object": "__main__.Goal", "IsPenalty": false, "GoaldID": -1}' 
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
# JSON encoded with jsonpickle.encode (default unpicklable=True) 
# => additional python class information attached 
# => can be decoded back to Python object 
>>> jsonpickle.decode(jsonpickle.encode(Goal())) 
<__main__.Goal object at 0x10af0e510> 


>>> jsonpickle.encode(Goal(), unpicklable=False) 
'{"IsPenalty": false, "GoaldID": -1}' 
# with unpicklable=False (similar output with json.dumps(..)) 
# => no python class information attached 
# => cannot be decoded back to Python object, but a dict 
>>> jsonpickle.decode(jsonpickle.encode(Goal(), unpicklable=False)) 
{'IsPenalty': False, 'GoaldID': -1} 

、object_hookでjson.loadsを使用し、あなたがdic["Goals"][0]["GoalGetterName"]dic.Goals.[0].GoalGetterNameを好むすなわち:

import json 
import types  
import requests 

url = "https://www.openligadb.de/api/getmatchdata/39738" 

result = requests.get(url) 
data = json.loads(result.content, object_hook=lambda d: types.SimpleNamespace(**d)) 
# OR data = result.json(object_hook=lambda d: types.SimpleNamespace(**d)) 
goal_getter = data.Goals[0].GoalGetterName 
# You get `types.SimpleNamespace` objects in place of dictionaries 
+0

ありがとうございました。私はdic経由の魔法の文字列アクセスが気に入らないので、dicをオブジェクトに変換するクラスメソッドを使うのがベストプラクティスですか? – Sebi

+0

@Sebi、なぜあなたはオブジェクトに辞書を変換しますか?私はちょうど私がPythonを使用していたときに変換せずに辞書/リスト/ ...を使用しました。 (私はそれが魔法の文字列アクセスだとは思わない;;;) – falsetru

+0

@セビー、私はこれを使わなかったが、これをチェックする:http://jsonmodels.readthedocs.io/en/latest/ – falsetru

5

を実行してくださいよこのような意味ですか?印刷し

import json 

class JsonObject(object): 

    def __init__(self, json_content): 
     data = json.loads(json_content) 
     for key, value in data.items(): 
      self.__dict__[key] = value  


jo = JsonObject("{\"key1\":1234,\"key2\":\"Hello World\"}") 
print(jo.key1) 

1234 
[Finished in 0.4s] 
+0

良いアプローチありがとう:) – Sebi

+0

あなたは大歓迎です:) – Den1al

関連する問題