2010-03-07 17 views
11

का उपयोग कर रहा है एक फाइल करने के लिए एक अजगर वस्तु लेखन jsonpickle प्रयोग करने के लिए निम्नलिखित सरल तरीके:बचत और लदान वस्तुओं jsonpickle

def json_serialize(obj, filename, use_jsonpickle=True): 
    f = open(filename, 'w') 
    if use_jsonpickle: 
     import jsonpickle 
     json_obj = jsonpickle.encode(obj) 
     f.write(json_obj) 
    else: 
     simplejson.dump(obj, f) 
    f.close() 

def json_load_file(filename, use_jsonpickle=True): 
    f = open(filename) 
    if use_jsonpickle: 
     import jsonpickle 
     json_str = f.read() 
     obj = jsonpickle.decode(json_str) 
    else: 
     obj = simplejson.load(f) 
    return obj 

समस्या यह है कि जब भी मैं इन का उपयोग करें, इसे वापस मेरी वस्तुओं को लोड करता है के रूप में है शब्दकोश (जिसमें फ़ील्ड हैं: "py/object": "my_module.MyClassName") लेकिन जेसन स्ट्रिंग उत्पन्न करने के लिए उपयोग किए जाने वाले प्रकार के वास्तविक पायथन ऑब्जेक्ट के रूप में नहीं। मैं इसे कैसे बना सकता हूं ताकि jsonpickle वास्तव में लोड की गई स्ट्रिंग को वापस ऑब्जेक्ट में परिवर्तित कर सके?

एक उदाहरण के साथ इस वर्णन करने के लिए, निम्नलिखित पर विचार:

class Foo: 
    def __init__(self, hello): 
    self.hello = hello 

# make a Foo obj 
obj = Foo("hello world") 
obj_str = jsonpickle.encode(obj) 
restored_obj = jsonpickle.decode(obj_str) 
list_objects = [restored_obj] 
# We now get a list with a dictionary, rather than 
# a list containing a Foo object 
print "list_objects: ", list_objects 

यह पैदावार:

list_objects: [{'py/object': 'as_events.Foo', 'hello': 'hello world'}] 

के बजाय की तरह कुछ: [फू()]। मैं इसे कैसे ठीक करूं?

धन्यवाद।

+0

क्या आप 'jsonpickle.decode()' लाइन से पहले 'as_events' आयात कर सकते हैं? – jfs

+0

FWIW यह एक महान उदाहरण है जब आपको फ़ाइल लेखन के लिए 'खुला()' संदर्भ प्रबंधक के साथ 'उपयोग करना चाहिए। जब आप यहां क्रमबद्ध त्रुटियों में भाग लेते हैं तो आप अपनी फाइलें खोल देंगे - यह बुरा है। – BoltzmannBrain

उत्तर

17

सही जवाब है कि मैं object से इनहेरिट नहीं किया गया था बनाओ। object से विरासत के बिना, jsonpickle कन्स्ट्रक्टर में एक या अधिक तर्क लेने वाले वर्गों को सही ढंग से डीकोड नहीं कर सकता है, ऐसा लगता है। मैं किसी भी तरह से एक विशेषज्ञ नहीं हूं लेकिन कक्षा घोषणा में Foo: के बजाय इसे Foo(object): बना रहा हूं।

2

सुनिश्चित करें कि use_jsonpickle == Truejson_load_file() में। ऐसा लगता है कि आप jsonpickle का उपयोग करके क्रमबद्ध करें और json का उपयोग करके लोड करें।

>>> import jsonpickle 
>>> class A(object): 
... def __init__(self, name): 
...  self.name = name 
... 
>>> js = jsonpickle.encode(A('abc')) 
>>> js 
'{"py/object": "__main__.A", "name": "abc"}'  # <-- json string 
>>> a = jsonpickle.decode(js) 
>>> a 
<__main__.A object at 0x7f826a87bd90>   # <-- python object 
>>> a.name 
u'abc' 
>>> import json 
>>> b = json.loads(js) 
>>> b 
{u'py/object': u'__main__.A', u'name': u'abc'} # <-- dictionary 

सुनिश्चित करें कि ऑब्जेक्ट प्रकार उपलब्ध है

>>> del A 
>>> c = jsonpickle.decode(js)     # no type available 
>>> c 
{u'py/object': u'__main__.A', u'name': u'abc'} 
>>> type(c) 
<type 'dict'> 
>>> class A(object): 
... def __init__(self, name): 
...  self.name = name 
... 
>>> d = jsonpickle.decode(js)     # type is available 
>>> d 
<__main__.A object at 0x7f826a87bdd0> 
>>> type(d) 
<class '__main__.A'> 
+0

क्या कोई मुझे बता सकता है कि {u'py/object 'में यह "u" चीज़ क्या है: u' __ मुख्य __। ए ', u'name': u'abc '}? – ed22

+0

@ ed22 यह है [पायथन 2 में यूनिकोड स्ट्रिंग अक्षर कैसे लिखे गए हैं] (https://docs.python.org/2/howto/unicode.html#unicode-literals-in-python-source-code)। 'repr (unicode_string) 'एक ही पाठ प्रतिनिधित्व का उपयोग करता है। – jfs

+0

आपको बहुत बहुत धन्यवाद! – ed22

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