2017-03-08 16 views
7

मुझे एक जेसन-स्ट्रिंग को पायथन ऑब्जेक्ट में कनवर्ट करने की आवश्यकता है। ऑब्जेक्ट से मेरा मतलब है "नया" पायथन 3 ऑब्जेक्ट:जेसन को ऑब्जेक्ट में कैसे परिवर्तित करें?

class MyClass(object): 

मुझे jsonpickle दस्तावेज़ों पर उदाहरण के लिए कई मदद मिलीं। लेकिन मुझे जो कुछ मिला वह ट्यूटोरियल हैं जो ऑब्जेक्ट को जेसन में पहले परिवर्तित करते हैं और इसके बाद पीछे की ओर कनवर्ट करते हैं।

मैं Rest-API से एक जेसन-स्ट्रिंग को कन्वर्ट करना चाहता हूं।

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

यह मेरे लिए काफी स्पष्ट है कि jsonpickle मेरी कक्षाओं को यह नहीं बदल सकते है (लक्ष्य, मैच:

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 नहीं बताता कि किस वर्ग में आउटपुट को परिवर्तित किया जाना चाहिए। समस्या यह है कि मुझे नहीं पता कि JSONpickle को जेएसओएन को ऑब्जेक्ट में टाइप मैच से कैसे परिवर्तित करना है? और मैं कैसे बता सकता हूं कि लक्ष्यों की सूची List<Goal> प्रकार का होना चाहिए?

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

obj = result.json() 

लेकिन इनमे से कोई भी आप आप क्या चाहते हैं (अजगर वस्तु (dicitonary नहीं)) दे देंगे:

+0

'obj = jsonpickle.decode (result.content)' => यह आपको एक शब्दकोश दे देंगे। – falsetru

+0

'obj = result.json() 'आपको एक शब्दकोश भी देगा। – falsetru

उत्तर

6

निम्नलिखित लाइनों आप एक शब्दकोश दे देंगे। क्योंकि यूआरएल से json jsonpickle.encode साथ इनकोडिंग नहीं है - एक उत्पन्न json के लिए अतिरिक्त जानकारी जोड़ने whcih ({"py/object": "__main__.Goal", ....} की तरह कुछ)


>>> 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} 

आप एक वास्तविक अजगर वस्तु जो एक शब्दकोश नहीं है चाहते हैं , आप dic["Goals"][0]["GoalGetterName"] करने के लिए पसंद करते हैं dic.Goals.[0].GoalGetterName यानी, object_hook साथ json.loads का उपयोग करें:

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

ठीक है बहुत बहुत धन्यवाद। क्योंकि मुझे डिक के माध्यम से जादू स्ट्रिंग एक्सेस पसंद नहीं है, क्या यह क्लास विधि का उपयोग करने का सबसे अच्छा अभ्यास है जो किसी डिक को ऑब्जेक्ट में परिवर्तित करता है? – Sebi

+0

@ सेबी, आप एक वस्तु को एक वस्तु में क्यों परिवर्तित करते हैं? जब मैंने पाइथन का उपयोग किया था तो मैंने कनवर्ट किए बिना शब्दकोश/सूची/... का उपयोग किया था। (मुझे नहीं लगता कि यह एक जादू स्ट्रिंग पहुंच है ;;) – 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

संबंधित मुद्दे