दिलचस्प पोस्ट
स्केलेक्शनएट्लस लोडिंग और मेमोरी प्रबंधन मुद्रित होने वाले पृष्ठ के लिए फ़िट / स्केल JComponent मैं कैसे एक छवि JPanel या JFrame आकर्षित कर सकता हूँ? NVARCHAR (अधिकतम) के लिए अधिकतम वर्ण क्या हैं? जॅक्स-डब्लूएस लोडिंग डब्लूएसडीएल जार से पायथन :: ऑपरेटर में स्ट्रिंग चालू करें । सी बनाम बनाम। सीसी बनाम .सीपीपी बनाम। एचपीपी बनाम। एच बनाम। सीएक्स प्राप्त करेंलोकनॉवनस्थान रिक्त स्थान रिक्त करता है कस्टम HTML5 आवश्यक फ़ील्ड सत्यापन संदेश सेट करें Json.net धारावाहिक / व्युत्पन्न प्रकार के deserialize? अलग भाषाओं के साथ strtomime? एसक्यूएल – अगर वर्तमान में अद्यतन करें पहला अक्षर खोजें जो दो तारों के बीच अलग है jquery contenteditable div में कर्सर स्थिति निर्धारित करना विकल्प (अनिवार्य, वैकल्पिक) और भागीदारी (कुल, आंशिक) समान हैं?

कैसे "datetime.datetime नहीं JSON serializable" को दूर करने के लिए?

मेरे पास एक बुनियादी शब्द है:

sample = {} sample['title'] = "String" sample['somedate'] = somedatetimehere 

जब मैं jsonify(sample) करने की कोशिश करता हूं:

TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable

मैं ऐसा कैसे कर सकता हूं कि मेरा शब्दकोश नमूना उपरोक्त त्रुटि को दूर कर सकता है?

नोट: यद्यपि यह प्रासंगिक नहीं हो सकता है, यह शब्द मोज़डब के बाहर रिकॉर्ड्स के पुनर्प्राप्ति से उत्पन्न होते हैं, जहां मैं str(sample['somedate']) जब str(sample['somedate']) मुद्रित करता हूं, आउटपुट है 2012-08-08 21:46:24.862000

वेब के समाधान से एकत्रित समाधान "कैसे "datetime.datetime नहीं JSON serializable" को दूर करने के लिए?"

चूंकि आप मॉंगओइंजिन (प्रति टिप्पणी) का उपयोग कर रहे हैं और पीमोंगो एक निर्भरता है, पीमोंगो ने जेएसन सीरियलाइजेशन के साथ मदद करने के लिए उपयोगिताओं को बनाया है:
http://api.mongodb.org/python/1.10.1/api/bson/json_util.html

उदाहरण उपयोग (क्रमिकरण):

 from bson import json_util import json json.dumps(anObject, default=json_util.default) 

उदाहरण उपयोग (deserialization):

 json.loads(aJsonString, object_hook=json_util.object_hook) 

अन्य उत्तरों पर बिल्डिंग, एक विशिष्ट क्रमबद्धता के आधार पर एक सरल समाधान जो कि तारों के लिए datetime.datetime और datetime.date वस्तुओं को परिवर्तित करता है।

 from datetime import date, datetime def json_serial(obj): """JSON serializer for objects not serializable by default json code""" if isinstance(obj, (datetime, date)): return obj.isoformat() raise TypeError ("Type %s not serializable" % type(obj)) 

जैसा कि देखा गया है, कोड सिर्फ यह पता लगाने की जांच करता है कि ऑब्जेक्ट कक्षा datetime.datetime या datetime.date , और उसके बाद आईएसओ 8601 प्रारूप, वाई वाई वाई-एमएम डीडीटीएच के अनुसार .isoformat() इसका एक क्रमबद्ध संस्करण तैयार करने के लिए उपयोग करता है: एमएम: एसएस (जिसे आसानी से जावास्क्रिप्ट द्वारा डीकोड किया गया है) अगर अधिक जटिल क्रमबद्ध अभ्यावेदन की मांग की जाती है, तो अन्य कोड का उपयोग स्ट्र () के बजाय (उदाहरण के लिए इस प्रश्न के अन्य उत्तर देखें) के लिए किया जा सकता है। कोड को किसी अपवाद को ऊपर उठाने से समाप्त होता है, मामले से निपटने के लिए इसे गैर-सीरिजलाज प्रकार के साथ बुलाया जाता है।

इस json_serial फ़ंक्शन का उपयोग निम्नानुसार किया जा सकता है:

 from datetime import datetime from json import dumps print dumps(datetime.now(), default=json_serial) 

जेएसएन मॉड्यूल दस्तावेजों के अनुभाग बेसिक उपयोग में पाया जा सकता है कि कैसे डिफ़ॉल्ट पैरामीटर को json.dumps के काम करता है।

दिनांक को स्ट्रिंग में कनवर्ट करें

 sample['somedate'] = str( datetime.now() ) 

मुझे अभी इस समस्या का सामना करना पड़ा है और मेरा समाधान है json.JSONEncoder subclass.JSONEncoder:

 from datetime import datetime import json class DateTimeEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, datetime): return o.isoformat() return json.JSONEncoder.default(self, o) 

आपके कॉल में ऐसा कुछ करें: json.dumps(yourobj, cls=DateTimeEncoder) .isoformat() मुझे ऊपर के उत्तर में से एक मिला है।

मेरी त्वरित और गंदी JSON डंप जो दिनांक और सब कुछ खाती है:

 json.dumps(my_dictionary, indent=4, sort_keys=True, default=str) 

जिन लोगों की आवश्यकता नहीं है या इसके लिए पीमोंगो लाइब्रेरी का उपयोग नहीं करना है .. आप इस छोटे से स्निपेट के साथ आसानी से डीटैनीज JSON रूपांतरण प्राप्त कर सकते हैं:

 def default(obj): """Default JSON serializer.""" import calendar, datetime if isinstance(obj, datetime.datetime): if obj.utcoffset() is not None: obj = obj - obj.utcoffset() millis = int( calendar.timegm(obj.timetuple()) * 1000 + obj.microsecond / 1000 ) return millis raise TypeError('Not sure how to serialize %s' % (obj,)) 

तो इसे इस तरह प्रयोग करें:

 import datetime, json print json.dumps(datetime.datetime.now(), default=default) 

उत्पादन:

 '1365091796124' 

यहां मेरा समाधान है:

 # -*- coding: utf-8 -*- import json class DatetimeEncoder(json.JSONEncoder): def default(self, obj): try: return super(DatetimeEncoder, obj).default(obj) except TypeError: return str(obj) 

तो आप इसे इस तरह उपयोग कर सकते हैं:

 json.dumps(dictionnary, cls=DatetimeEncoder) 

मेरे पास इसी तरह की एक समस्या है; मेरा दृष्टिकोण 6-आइटम सूची (वर्ष, महीना, दिन, घंटे, मिनट, सेकंड) के रूप में डेटाटाइम मूल्य को JSONize करने के लिए था; आप 7-आइटम सूची के रूप में माइक्रोसॉन्ड्स पर जा सकते हैं, लेकिन मुझे इसकी कोई आवश्यकता नहीं थी:

 class DateTimeEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): encoded_object = list(obj.timetuple())[0:6] else: encoded_object =json.JSONEncoder.default(self, obj) return encoded_object sample = {} sample['title'] = "String" sample['somedate'] = datetime.datetime.now() print sample print json.dumps(sample, cls=DateTimeEncoder) 

पैदा करता है:

 {'somedate': datetime.datetime(2013, 8, 1, 16, 22, 45, 890000), 'title': 'String'} {"somedate": [2013, 8, 1, 16, 22, 45], "title": "String"} 

मेरा समाधान (कम स्पष्टता के साथ, मुझे लगता है):

 def default(o): if type(o) is datetime.date or type(o) is datetime.datetime: return o.isoformat() def jsondumps(o): return json.dumps(o, default=default) 

फिर jsondumps बजाय jsondumps उपयोग करें यह प्रिंट होगा:

 >>> jsondumps({'today': datetime.date.today()}) '{"today": "2013-07-30"}' 

मैं चाहता हूं, बाद में आप default विधि के साधारण मोड़ के साथ अन्य विशिष्ट मामलों को जोड़ सकते हैं। उदाहरण:

 def default(o): if type(o) is datetime.date or type(o) is datetime.datetime: return o.isoformat() if type(o) is decimal.Decimal: return float(o) 

यह क्यू समय और समय दोबारा दोहराता है – जेसन मॉड्यूल को पैच करने का एक आसान तरीका है, ताकि सीरियलाइजेशन डेट टाइम को समर्थन दे सके।

 import json import datetime json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None) 

जेसन सीरियललाइजेशन जितना तुम करते हो उतना ही करते हैं – इस समय डेटोलाइट को आइसोफॉर्मैट के रूप में सीरियल किया जा रहा है।

 json.dumps({'created':datetime.datetime.now()}) 

में परिणाम: '{"बनाया": "2015-08-26 टी 14: 21: 31.853855"}'

अधिक विवरण और सावधानी के कुछ शब्द यहां देखें: स्टैक ओवरफ्लो: अजगर और जावास्क्रिप्ट के बीच जेएसओएन डेट टाइम

यहां "डेट-टाइम नॉन जेएसओएन सीरियलाइज करने योग्य" समस्या आने का एक सरल समाधान है

 enco = lambda obj: ( obj.isoformat() if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date) else None ) json.dumps({'date': datetime.datetime.now()}, default=enco) 

आउटपुट: -> {"दिनांक": "2015-12-16T04: 48: 20.024609"}

आपको json.dumps के json.dumps पैरामीटर के साथ एक कस्टम एन्कोडर क्लास प्रदान करना होगा डॉक्स से उद्धृत करने के लिए:

 >>> import json >>> class ComplexEncoder(json.JSONEncoder): ... def default(self, obj): ... if isinstance(obj, complex): ... return [obj.real, obj.imag] ... return json.JSONEncoder.default(self, obj) ... >>> dumps(2 + 1j, cls=ComplexEncoder) '[2.0, 1.0]' >>> ComplexEncoder().encode(2 + 1j) '[2.0, 1.0]' >>> list(ComplexEncoder().iterencode(2 + 1j)) ['[', '2.0', ', ', '1.0', ']'] 

यह उदाहरण के रूप में जटिल संख्याओं का उपयोग करता है, लेकिन आप आसानी से तिथियों को एन्कोड करने के लिए एक क्लास भी बना सकते हैं (मुझे लगता है कि JSON की तिथियों के बारे में थोड़ा अजीब है)

ऐसा करने का सबसे सरल तरीका यह है कि डिक्ट का हिस्सा बदलना है जो डेटोम प्रारूप में isoformat है। यह मान प्रभावी रूप से isoformat में एक स्ट्रिंग होगा जो json ठीक है।

 v_dict = version.dict() v_dict['created_at'] = v_dict['created_at'].isoformat() 

यहाँ JSON और वापस करने के लिए datetime को बदलने के लिए मेरा पूरा समाधान है ..

 import calendar, datetime, json def outputJSON(obj): """Default JSON serializer.""" if isinstance(obj, datetime.datetime): if obj.utcoffset() is not None: obj = obj - obj.utcoffset() return obj.strftime('%Y-%m-%d %H:%M:%S.%f') return str(obj) def inputJSON(obj): newDic = {} for key in obj: try: if float(key) == int(float(key)): newKey = int(key) else: newKey = float(key) newDic[newKey] = obj[key] continue except ValueError: pass try: newDic[str(key)] = datetime.datetime.strptime(obj[key], '%Y-%m-%d %H:%M:%S.%f') continue except TypeError: pass newDic[str(key)] = obj[key] return newDic x = {'Date': datetime.datetime.utcnow(), 34: 89.9, 12.3: 90, 45: 67, 'Extra': 6} print x with open('my_dict.json', 'w') as fp: json.dump(x, fp, default=outputJSON) with open('my_dict.json') as f: my_dict = json.load(f, object_hook=inputJSON) print my_dict 

उत्पादन

 {'Date': datetime.datetime(2013, 11, 8, 2, 30, 56, 479727), 34: 89.9, 45: 67, 12.3: 90, 'Extra': 6} {'Date': datetime.datetime(2013, 11, 8, 2, 30, 56, 479727), 34: 89.9, 45: 67, 12.3: 90, 'Extra': 6} 

JSON फाइल

 {"Date": "2013-11-08 02:30:56.479727", "34": 89.9, "45": 67, "12.3": 90, "Extra": 6} 

इससे मुझे स्ट्रिंग्स, इनट्स, फ़्लोट्स और डेटाइम ऑब्जेक्ट आयात करने और निर्यात करने में सक्षम हुआ है। अन्य प्रकारों के लिए विस्तार करना कठिन नहीं होना चाहिए

यदि आप नतीजे में नतीजे का उपयोग कर रहे हैं तो एक उचित प्रतिक्रिया वापस कर लें। एपीआई के अनुसार, jsonify निम्न करता है:

एक आवेदन / जेएसन माइम टाइप के साथ दिए गए तर्कों के JSON प्रतिनिधित्व के साथ प्रतिक्रिया बनाता है

Json.dumps के साथ इस व्यवहार की नकल करने के लिए आपको कोड की कुछ अतिरिक्त लाइनें जोड़नी हैं।

 response = make_response(dumps(sample, cls=CustomEncoder)) response.headers['Content-Type'] = 'application/json' response.headers['mimetype'] = 'application/json' return response 

आपको जेसनइज़ की प्रतिक्रिया को पूर्ण रूप से दोहराने के लिए एक शब्द भी वापस करना चाहिए। इसलिए, पूरी फाइल इस तरह दिखाई देगी

 from flask import make_response from json import JSONEncoder, dumps class CustomEncoder(JSONEncoder): def default(self, obj): if set(['quantize', 'year']).intersection(dir(obj)): return str(obj) elif hasattr(obj, 'next'): return list(obj) return JSONEncoder.default(self, obj) @app.route('/get_reps/', methods=['GET']) def get_reps(): sample = ['some text', <datetime object>, 123] response = make_response(dumps({'result': sample}, cls=CustomEncoder)) response.headers['Content-Type'] = 'application/json' response.headers['mimetype'] = 'application/json' return response 

मेरा समाधान …

 from datetime import datetime import json from pytz import timezone import pytz def json_dt_serializer(obj): """JSON serializer, by macm. """ rsp = dict() if isinstance(obj, datetime): rsp['day'] = obj.day rsp['hour'] = obj.hour rsp['microsecond'] = obj.microsecond rsp['minute'] = obj.minute rsp['month'] = obj.month rsp['second'] = obj.second rsp['year'] = obj.year rsp['tzinfo'] = str(obj.tzinfo) return rsp raise TypeError("Type not serializable") def json_dt_deserialize(obj): """JSON deserialize from json_dt_serializer, by macm. """ if isinstance(obj, str): obj = json.loads(obj) tzone = timezone(obj['tzinfo']) tmp_dt = datetime(obj['year'], obj['month'], obj['day'], hour=obj['hour'], minute=obj['minute'], second=obj['second'], microsecond=obj['microsecond']) loc_dt = tzone.localize(tmp_dt) deserialize = loc_dt.astimezone(tzone) return deserialize 

ठीक है, अब कुछ परीक्षण

 # Tests now = datetime.now(pytz.utc) # Using this solution rsp = json_dt_serializer(now) tmp = json_dt_deserialize(rsp) assert tmp == now assert isinstance(tmp, datetime) == True assert isinstance(now, datetime) == True # using default from json.dumps tmp = json.dumps(datetime.now(pytz.utc), default=json_dt_serializer) rsp = json_dt_deserialize(tmp) assert isinstance(rsp, datetime) == True # Lets try another timezone eastern = timezone('US/Eastern') now = datetime.now(eastern) rsp = json_dt_serializer(now) tmp = json_dt_deserialize(rsp) print(tmp) # 2015-10-22 09:18:33.169302-04:00 print(now) # 2015-10-22 09:18:33.169302-04:00 # Wow, Works! assert tmp == now 

एसक्लाइज़ डेकोरेटर लिखते समय मुझे एक ही त्रुटि संदेश मिल गया है जिसमें स्क्लेलैमी के साथ क्लास के अंदर इसके बजाय:

 Class Puppy(Base): ... @property def serialize(self): return { 'id':self.id, 'date_birth':self.date_birth, ... } 

मैं आइफॉर्मैट () का उपयोग करने के जेजीबारह के विचार को उधार लेता हूं और आइसफोर्मैट () के साथ मूल मान को जोड़ता हूं, ताकि यह अब दिखता है:

  ... 'date_birth':self.date_birth.isoformat(), ... 

date करने के लिए string कन्वर्ट

 date = str(datetime.datetime(somedatetimehere)) 

एक त्वरित ठीक है अगर आप अपना स्वयं का स्वरूपण चाहते हैं

 for key,val in sample.items(): if isinstance(val, datetime): sample[key] = '{:%Y-%m-%d %H:%M:%S}'.format(val) #you can add different formating here json.dumps(sample) 

आम तौर पर डेटासेटों को क्रमबद्ध करने के कई तरीके हैं, जैसे:

  1. आईएसओ स्ट्रिंग, कम और समयक्षेत्र जानकारी शामिल कर सकते हैं, जैसे @ जेजीबारह का जवाब
  2. टाइमस्टैम्प (टाईमजोन डेटा खोया जाता है), उदाहरण के लिए @ जे टेयलर का जवाब
  3. गुणों का शब्दकोश (समयक्षेत्र सहित)

अगर आप अंतिम तरीके से ठीक हैं, तो json_tricks पैकेज समयक्षेत्र सहित दिनांक, समय और डेटासेट का प्रबंधन करता है।

 from datetime import datetime from json_tricks import dumps foo = {'title': 'String', 'datetime': datetime(2012, 8, 8, 21, 46, 24, 862000)} dumps(foo) 

जो देता है:

 {"title": "String", "datetime": {"__datetime__": null, "year": 2012, "month": 8, "day": 8, "hour": 21, "minute": 46, "second": 24, "microsecond": 862000}} 

तो आपको बस इतना करना होगा कि

 `pip install json_tricks` 

और फिर json बजाय json_tricks से आयात करें

इसे एकल स्ट्रिंग के रूप में संग्रहीत करने का लाभ, इंट या फ्लोट तब आता है जब डीकोडिंग होता है: अगर आपको केवल एक स्ट्रिंग या विशेष रूप से इंट या फ्लोट मिलता है, तो आपको यह जानने के लिए डेटा के बारे में कुछ पता होना चाहिए कि क्या यह एक datetime है एक शब्दकोश के रूप में, आप मेटाडाटा को स्टोर कर सकते हैं, जिससे इसे स्वचालित रूप से डीकोड किया जा सकता है, जो कि json_tricks लिए json_tricks क्या करता है यह मनुष्य के लिए आसानी से संपादन योग्य है

अस्वीकरण: यह मेरे द्वारा बनाई गई है क्योंकि मुझे एक ही समस्या थी

JSON के रूप में डंप करने के लिए डीजेंगो मॉडल ऑब्जेक्ट को बाहरी करते समय मुझे एक ही समस्या का सामना करना पड़ा था। यहां बताया गया है कि आप इसे कैसे हल कर सकते हैं।

 def externalize(model_obj): keys = model_obj._meta.get_all_field_names() data = {} for key in keys: if key == 'date_time': date_time_obj = getattr(model_obj, key) data[key] = date_time_obj.strftime("%A %d. %B %Y") else: data[key] = getattr(model_obj, key) return data 

या तो दोनों ही दिनांक mysql में और साथ ही अजगर कोड json में स्ट्रिंग के रूप में या दोनों दिनांक या दिनांक समय यह मेरे लिए काम किया है क्योंकि मैं mysql टाइप को स्ट्रिंग में परिवर्तित कर रहा हूं।

मेरा समाधान केवल EPOCH का उपयोग करने के लिए समय था (जो एक संख्या है) क्योंकि मेरे उपयोग के मामले में अंत उपयोगकर्ता को JSON में समय पढ़ने की आवश्यकता नहीं थी। यह युग का समय के साथ काम करने के लिए इतना आसान था

मैं 100% सही नहीं कर सकता हूँ, लेकिन यह सीरियललाइज करना आसान तरीका है

 #!/usr/bin/python import datetime,json sampledict = {} sampledict['a'] = "some string" sampledict['b'] = datetime.datetime.now() print sampledict # output : {'a': 'some string', 'b': datetime.datetime(2017, 4, 15, 5, 15, 34, 652996)} #print json.dumps(sampledict) ''' output : Traceback (most recent call last): File "./jsonencodedecode.py", line 10, in <module> print json.dumps(sampledict) File "/usr/lib/python2.7/json/__init__.py", line 244, in dumps return _default_encoder.encode(obj) File "/usr/lib/python2.7/json/encoder.py", line 207, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode return _iterencode(o, 0) File "/usr/lib/python2.7/json/encoder.py", line 184, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: datetime.datetime(2017, 4, 15, 5, 16, 17, 435706) is not JSON serializable ''' sampledict['b'] = datetime.datetime.now().strftime("%B %d, %Y %H:%M %p") afterdump = json.dumps(sampledict) print afterdump #output : {"a": "some string", "b": "April 15, 2017 05:18 AM"} print type(afterdump) #<type 'str'> afterloads = json.loads(afterdump) print afterloads # output : {u'a': u'some string', u'b': u'April 15, 2017 05:18 AM'} print type(afterloads) # output :<type 'dict'> 

आपको serializable के लिए datetime.now () विधि पर स्ट्रिपटाइम () विधि का उपयोग करना चाहिए। जैसे कोड नीचे:

 from datetime import datetime time_dict = {'time': datetime.now().strftime('%Y-%m-%dT%H:%M:%S')} sample_dict = {'a': 1, 'b': 2} sample_dict.update(time_dict) sample_dict 

उत्पादन:

 Out: {'a': 1, 'b': 2, 'time': '2017-10-31T15:16:30'}