কীভাবে "ডেটটাইম.ডেটটাইম জেএসএন সিরিয়ালাইজযোগ্য নয়" কাটিয়ে উঠবেন?


739

আমার নীচের মত একটি বেসিক ডিক আছে:

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

আমি যখন চেষ্টা করার চেষ্টা করি তখন আমি jsonify(sample)পাই:

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

আমি কী করতে পারি যে আমার অভিধানের নমুনা উপরের ত্রুটিটি কাটিয়ে উঠতে পারে?

দ্রষ্টব্য: যদিও এটি প্রাসঙ্গিক নাও হতে পারে, অভিধানগুলি রেকর্ড পুনরুদ্ধার থেকে উত্পন্ন হয় mongodbযেখানে আমি যখন মুদ্রণ করি তখন str(sample['somedate'])আউটপুট হয় 2012-08-08 21:46:24.862000


1
এটি কি সাধারণভাবে অজগরটি, বা সম্ভবত জ্যাঙ্গো?
jdi

1
এটি প্রযুক্তিগতভাবে বিশেষত অজগর, আমি জাঙ্গো ব্যবহার করছি না, তবে মংডোব থেকে রেকর্ড পুনরুদ্ধার করছি।
রোল্যান্ডো


আমি মঙ্গোইজিন ব্যবহার করছি, তবে যদি পাইমোঙ্গোতে আরও কাছাকাছি যাওয়ার বা এটি কাটিয়ে উঠার আরও ভাল উপায় থাকে তবে দয়া করে জানান।
রোল্যান্ডো

3
লিঙ্কযুক্ত প্রশ্নটি আপনাকে মূলত ডেটটাইম অবজেক্টটি সিরিয়াল করার চেষ্টা না করে বরং সিরিয়ালেজ করার আগে সাধারণ আইএসও ফর্ম্যাটে একটি স্ট্রিংয়ে রূপান্তর করতে বলছে।
টমাস কেলি

উত্তর:


377

2018 এর জন্য আপডেট হয়েছে

আসল উত্তরটি মঙ্গোডিবি "তারিখ" ক্ষেত্রগুলিকে যেভাবে উপস্থাপিত হয়েছিল তা সমন্বিত করেছিল:

{"$date": 1506816000000}

আপনি যদি জসনকে সিরিয়ালাইজ datetimeকরার জন্য জেনেরিক পাইথন সমাধান চান তবে দ্রুত সমাধানের জন্য @ jjmontes এর উত্তরটি পরীক্ষা করে দেখুন যার কোনও নির্ভরতা নেই।


আপনি যেহেতু মঙ্গোইজিন (প্রতিটি মন্তব্যে) ব্যবহার করছেন এবং পাইমোঙ্গো নির্ভরতা, তাই জিমসন সিরিয়ালাইজেশনে সহায়তা করার জন্য পিমোঙ্গো বিল্ট-ইন ইউটিলিটিগুলি রয়েছে:
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)

জ্যাঙ্গো

জ্যাঙ্গো একটি দেশীয় সরবরাহ করে DjangoJSONEncoder সিরিয়ালাইজার সরবরাহ করে যা এই ধরণের সঠিকভাবে মোকাবেলা করে।

Https://docs.djangoproject.com/en/dev/topics/serialization/#djangojsonencoder দেখুন

from django.core.serializers.json import DjangoJSONEncoder

return json.dumps(
  item,
  sort_keys=True,
  indent=1,
  cls=DjangoJSONEncoder
)

এর মধ্যে DjangoJSONEncoderএবং এর defaultমতো একটি কাস্টম ব্যবহারের মধ্যে আমি একটি পার্থক্য লক্ষ্য করেছি :

import datetime
import json

def default(o):
    if isinstance(o, (datetime.date, datetime.datetime)):
        return o.isoformat()

return json.dumps(
  item,
  sort_keys=True,
  indent=1,
  default=default
)

এটি কি জ্যাঙ্গো কিছুটা ডেটা রেখেছে:

 "last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder 
 "last_login": "2018-08-03T10:51:42.990239", # default

সুতরাং, আপনার কিছু ক্ষেত্রে এটি সম্পর্কে সতর্কতা অবলম্বন করা প্রয়োজন।


3
একাধিক লাইব্রেরি মিশ্রণ করা কি ভাল / খারাপ অনুশীলন যেমন ক্যোরি / পুনরুদ্ধারের জন্য ডকস এবং পাইমোঙ্গো সন্নিবেশ করার জন্য মঙ্গোইনজিন থাকা?
রোল্যান্ডো

এটি খারাপ অনুশীলন নয়, এটি আপনার প্রধান লাইব্রেরি ব্যবহার করে এমন লাইব্রেরিতে কিছুটা নির্ভরতা বোঝায়। আপনি যদি মঙ্গোইজিন থেকে আপনার প্রয়োজনীয়তাটি সম্পাদন করতে না পারেন তবে আপনি পিমনোগোতে নেমে যাবেন। এটি একই সঙ্গে Django MongoDB। পরবর্তীকালে, আপনি ব্যাকএন্ড অজন্যস্টিক অবস্থা বজায় রাখতে জাঙ্গো ওআরএম এর মধ্যে থাকার চেষ্টা করবেন। তবে কখনও কখনও আপনি বিমূর্তে যা প্রয়োজন তা করতে পারেন না, তাই আপনি একটি স্তর বাদ দিন। এই ক্ষেত্রে, এটি আপনার সমস্যার সাথে পুরোপুরি সম্পর্কিত নয় কারণ আপনি JSON ফর্ম্যাটটি সহ কেবল ইউটিলিটি পদ্ধতি ব্যবহার করছেন।
jdi

আমি এটি ফ্লাস্কের সাথে চেষ্টা করে দেখছি এবং মনে হচ্ছে json.dump ব্যবহার করে, আমি এর চারপাশে একটি জসোনাইফ () র‌্যাপার রাখতে পারছি না যা এটি প্রয়োগ / জসনতে ফিরে আসে। জসনাইফাই ফিরতে চেষ্টা করা হচ্ছে (json.dumps (নমুনা, ডিফল্ট = json_util.default))
রোল্যান্ডো

2
@ এমিট এটি সিনট্যাক্স মুখস্থ করার বিষয়ে এতটা নয়, কারণ ডকুমেন্টেশনগুলি পড়া এবং আমার মাথার মধ্যে পর্যাপ্ত তথ্য সঞ্চার করার ক্ষেত্রে এটি কখন এবং কখন আমাকে পুনরুদ্ধার করতে হবে তা জানার জন্য। এক্ষেত্রে, কেউ বলতে পারেন "ওস একটি কাস্টম অবজেক্ট জসসন" এবং তারপরে দ্রুত সেই ব্যবহারটি রিফ্রেশ করুন
jdi

2
@ গুইস্ক্ক আমি ৫ বছর আগে এটি লেখার পর থেকে আমি বিজেসন বা মঙ্গোতে পরিবর্তনগুলি ট্র্যাক করতে পারি নি। তবে আপনি যদি ডেটটাইমের সিরিয়ালাইজেশন নিয়ন্ত্রণ করতে চান তবে আপনার নিজের ডিফল্ট হ্যান্ডলার ফাংশনটি লিখতে হবে জগবারার দেওয়া উত্তরে চিত্রিত
jdi

615

আমার দ্রুত এবং মলিন JSON ডাম্প যা খেজুর এবং সমস্ত কিছু খায়:

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

13
এটি দুর্দান্ত, তবে দুর্ভাগ্যক্রমে আমি বুঝতে পারি নি কী ঘটেছিল? এই উত্তর কেউ ব্যাখ্যা করতে পারেন?
কিশোর পাওয়ার

61
@ কিশোরপওয়ার: defaultএমন একটি ফাংশন যা বস্তুগুলিতে প্রয়োগ করা হয় যা সিরিয়ালযোগ্য নয়। এই ক্ষেত্রে এটি str, তাই এটি স্ট্রিংগুলিতে যা জানে না তার সবকিছুকে কেবল রূপান্তরিত করে। যা সিরিয়ালাইজেশনের জন্য দুর্দান্ত তবে ডিসরিয়ালাইজ করার সময় এত দুর্দান্ত নয় (অতএব "দ্রুত এবং নোংরা") কারণ কোনও সতর্কতা ছাড়াই স্ট্রিং-আইআইডি হতে পারে, যেমন কোনও ফাংশন বা অলস অ্যারে।
চিহ্নিত করুন

1
@ মারাক দুর্দান্ত ধন্যবাদ। আপনি যখন তারিখের মতো এই অ-সিরিয়ালযোগ্য মানগুলির প্রকারটি জানেন তখন দরকারী।
কিশোর পওয়ার

2
আমি কেন জানি সারা জীবন এই না জেনেছি। :)
আরেল 3'19

1
@ Jjmontes, সব কিছুর জন্য কাজ করে না, যেমন json.dumps({():1,type(None):2},default=str)উত্থাপন করে TypeError, টাইপ বা টিপল থাকতে পারে না।
অ্যালানচলভিট্টি

443

অন্যান্য উত্তরের ভিত্তিতে বিল্ডিং, একটি নির্দিষ্ট সিরিয়ালাইজের ভিত্তিতে একটি সাধারণ সমাধান যা কেবল স্ট্রিংগুলিতে রূপান্তরিত করে 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এবং তা ব্যবহারের জন্য তা পরীক্ষা করে দেখেছে.isoformat() এটির একটি সিরিয়াল সংস্করণ তৈরি করতে করে তা অনুসন্ধানের জন্য অনুসন্ধান করে, YYYY-MM-DDTHH: MM: SS (যা জাভাস্ক্রিপ্ট দ্বারা সহজেই ডিকোড করা হয়) )। যদি আরও জটিল সিরিয়ালযুক্ত উপস্থাপনাগুলি সন্ধান করা হয় তবে স্ট্র () এর পরিবর্তে অন্যান্য কোড ব্যবহার করা যেতে পারে (উদাহরণের জন্য এই প্রশ্নের অন্যান্য উত্তর দেখুন)। কোডটি একটি ব্যতিক্রম উত্থাপনের মাধ্যমে শেষ হয়, কেসটি মোকাবেলা করার জন্য এটি নন-সিরিয়ালাইজযোগ্য টাইপের সাথে ডাকা হয়।

এই json_serial ফাংশনটি নীচে ব্যবহার করা যেতে পারে:

from datetime import datetime
from json import dumps

print dumps(datetime.now(), default=json_serial)

জসন.ডাম্পসের ডিফল্ট প্যারামিটারটি কীভাবে কাজ করে সে সম্পর্কে বিবরণ জসন মডিউল ডকুমেন্টেশনের বিভাগের বেসিক ব্যবহারে পাওয়া যাবে ।


5
হ্যাঁ সঠিক উত্তর, আরও সুন্দর আমদানির ডেটটাইম এবং যদি আইসনস্ট্যান্স (অবজেক্ট, ডেটটাইম.ডেটটাইম), আমি অনেক সময় হারিয়েছি কারণ তারিখের সময় আমদানির তারিখের সময় থেকে ব্যবহৃত হয়নি, যাইহোক ধন্যবাদ
সেরজিও

12
তবে এটি সঠিক ধরণের মাধ্যমে কীভাবে এটি deserialise করবেন তা ব্যাখ্যা করে না, তাই না?
ব্লুট্রিন

2
না, ব্লুট্রিন, এ সম্পর্কে কিছুই বলেনি। আমার ক্ষেত্রে, আমি জাভাস্ক্রিপ্টে ডিসরিয়ালাইজ করছি, যা বাক্সের বাইরে কাজ করে।
jgbarah

1
এটি যদি জেসন মডিউলটি ডেটটাইম অবজেক্টের সিরিয়ালাইজেশন অন্তর্ভুক্ত করতে আপডেট করে তবে এটি অপ্রত্যাশিত আচরণের কারণ ঘটবে।
জাস্টিন

1
@ সের্গ তবে সময়কে ইউটিসিতে রূপান্তর করা একীভূত হবে 01:00:00+01:00এবং 02:00:00+00:00যা প্রসঙ্গের উপর নির্ভর করে এক হতে হবে বলে মনে হয় না। তারা অবশ্যই একই সময়ে একই পয়েন্টটি উল্লেখ করে তবে অফসেটটি মানটির একটি প্রাসঙ্গিক দিক হতে পারে।
Alfe

211

আমি সবেমাত্র এই সমস্যার মুখোমুখি হয়েছি এবং আমার সমাধানটি সাবক্লাসে রয়েছে json.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()আমি উপরের উত্তর এক থেকে পেয়েছিলাম।


22
আপড কারণ একটি কাস্টম JSONEncoder বাস্তবায়ন করার সঠিক উপায় হওয়া উচিত
কে-

25
কেবল এটিই শীর্ষের উত্তর হওয়া উচিত নয়, এটি নিয়মিত জসন এনকোডারটির অংশ হওয়া উচিত। যদি শুধুমাত্র পাঠোদ্ধারতা কম দ্ব্যর্থক .. ছিল
জুস্ট

4
জ্যাঙ্গো ব্যবহারকারীদের জন্য, দেখুন DjangoJSONEncoderdocs.djangoproject.com/en/dev/topics/serialization/…
এস। কি

4
সুপার সহায়ক। শেষ লাইনটি হতে পারেreturn super(DateTimeEncoder, self).default(o)
বব স্টেইন

16
পাইথন 3 এর সাথে শেষ লাইনটি আরও সহজ:return super().default(o)
এয়ারডেল

123

তারিখটিকে একটি স্ট্রিতে রূপান্তর করুন

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

10
এবং পাইথনে আমি কীভাবে এটি ডিসরিয়ালাইজ করতে পারি?
wobmene

62
সমস্যাটি হ'ল যদি আপনার কাছে অনেকগুলি ডেটটাইম অবজেক্ট থাকে যা ডেটা কাঠামোর গভীরে এম্বেড থাকে বা এলোমেলো হয়। এটি একটি নির্ভরযোগ্য পদ্ধতি নয়।
রিবস

3
deserialize করুন: oDate = datetime.datetime.strptime(sDate, '%Y-%m-%d %H:%M:%S.%f')। ফর্ম্যাটগুলি থেকে প্রাপ্ত: docs.python.org/2/library/datetime.html
রোমান

13
টাইমজোন সম্পর্কিত তথ্য উপেক্ষা করার কারণে ডাউনভোটেড। .now()এটি নির্দিষ্ট না করে স্থানীয় সময়টি মনে রাখবেন । কমপক্ষে .utcnow()ব্যবহার করা উচিত (এবং তারপরে একটি +0000 বা জেড সংযুক্ত)
ড্যানিয়েল এফ

1
@ ড্যানিয়েলএফ At least .utcnow() should be usedঠিক নয়, datetime.now(timezone.utc)প্রস্তাবিত, সতর্কতাটি দেখুন: ডকস.পিথথন.আর . / ৮.৮ / লাইব্রেরি /
টোরেনো

79

অন্যদের জন্য যাদের প্রয়োজন নেই বা এর জন্য পাইমোঙ্গো গ্রন্থাগারটি ব্যবহার করতে চান .. আপনি এই ছোট স্নিপেটের সাহায্যে ডেটটাইম জেএসওএন রূপান্তরটি সহজেই অর্জন করতে পারেন:

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'

1
millis=যদি বিবৃতিটির ভিতরে ইন্টেন্ট করা উচিত নয় ? আইএসও ফর্ম্যাটটি পেতে যেটি আমি বেশি সাধারণ বলে মনে করি তা পাওয়ার জন্য str (ob) ব্যবহার করা আরও ভাল।
রিবস

কেন আপনি এটি ইন্টেন্ট করাতে চান? এই স্নিপেট কাজ করে এবং ফলস্বরূপ আউটপুটটি জাভাস্ক্রিপ্ট থেকে সহজেই deserialized / পার্স করা যায়।
জে টেলর

5
কারণ আপত্তি কোনও [সময়, তারিখ, তারিখের সময়] অবজেক্ট নাও হতে পারে

2
স্থানীয় টাইমজোনটিতে শূন্য-শূন্য ইউটিসি অফসেট থাকলে (তাদের বেশিরভাগটি) আপনার উদাহরণটি ভুল। datetime.now()স্থানীয় সময় ফেরত দেয় (একটি নিষ্পাপ ডেটটাইম অবজেক্ট হিসাবে) তবে আপনার কোড ধরে নিয়েছে যে objএটি ইউটিসি-তে রয়েছে যদি সময় অঞ্চল-সচেতন না হয়। datetime.utcnow()পরিবর্তে ব্যবহার করুন।
jfs

1
ডকস.পিথথন.আর / 2 / লিবারি / জসন এইচটিএমএল#basic-usage এ পাইথন ডকুমেন্টেশন সুপারিশ অনুসারে অজানা যদি স্বীকৃত হয় তবে এটি কোনও ধরণের ত্রুটি বাড়াতে সমন্বিত করুন
জে টেলর

40

এখানে আমার সমাধান:

# -*- 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)

সম্মত হন। আরও ভাল, কমপক্ষে মোংডব প্রসঙ্গে। আপনি কি করতে পারেন isinstance(obj, datetime.datetime), TypeError মধ্যে হাতল আরো ধরনের যোগ করুন, এবং আপ শেষ str(obj)বা repr(obj)। এবং আপনার সমস্ত ডাম্প কেবল এই বিশেষায়িত বর্গের দিকে নির্দেশ করতে পারে।
জেএল পাইরেট

@ নাতিম এই সমাধানটি সেরা। +1
সৌভিক রায়

20

আমার অনুরূপ ইস্যু সহ একটি অ্যাপ্লিকেশন রয়েছে; আমার পদ্ধতির 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"}


1
ডেটটাইম.টুকন () দিয়ে আপনি কী ত্রুটি দেখছেন? এটি আমার পক্ষে ঠিক আছে।
কোডিংটি

17

আমার সমাধান (কম শব্দ সহ, আমি মনে করি):

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করুন json.dumps। এটি মুদ্রণ করবে:

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

1
আপনার আইসনস্ট্যান্স (ও, (ডেটটাইম ডেট, ডেটটাইম.ডেটটাইম,)) ব্যবহার করা উচিত। সম্ভবত ডেটটাইম.টাইমও অন্তর্ভুক্ত করতে ক্ষতি করবে না।
রিবস

আমি এটি আর ভাল সমাধান বলে মনে করি না। সম্ভবত আপনার কোডটিতে রূপান্তরগুলি আরও বেশি সুবিধামত স্থান এবং আরও বোধগম্য স্থান গ্রহণ করা উচিত, যাতে আপনি জানেন যে আপনি যখন একটি ডেটাবেসে জিনিস রাখেন তখন আপনি কী রূপান্তর করছেন বা যা কিছু ঘটেছে তার পরিবর্তে সমস্ত কিছু করার পরিবর্তে স্বচ্ছ ফাংশন। তবে আমি জানি না।
ফিয়াতজাফ

1
JSON পরে প্রক্রিয়াজাতকরণের জন্য ডেটা সিরিয়াল করার জন্য ভাল। আপনি যে তথ্যটি ঠিক তা জানেন না। এবং আপনার প্রয়োজন হবে না। সিরিয়ালাইজিং জেএসএনের কেবল কাজ করা উচিত। ইউনিকোডকে এস্কিতে রূপান্তর করার মতোই। অস্পষ্ট ফাংশন ব্যতীত পাইথনের এটি করতে অক্ষমতা এটি ব্যবহারে বিরক্তিকর করে তোলে। ডাটাবেস বৈধতা একটি পৃথক ইস্যু আইএমও।
রিবস

না, এটি "শুধু কাজ" করা উচিত নয়। কীভাবে সিরিয়ালাইজেশন ঘটেছিল এবং অন্য প্রোগ্রাম / ভাষা থেকে পরে ডেটা অ্যাক্সেস করতে হবে তা যদি আপনি না জানেন, তবে আপনি হারিয়ে গেছেন।
ফায়াতজাফ

2
জেএসএন সাধারণত স্ট্রিং, ইনটস, ফ্লোটস, তারিখগুলির জন্য ব্যবহৃত হয় (আমি নিশ্চিত যে অন্যরা সাধারণত মুদ্রা, তাপমাত্রা ব্যবহার করে)। তবে ডেটটাইম স্ট্যান্ডার্ড লাইব্রেরির অংশ এবং ডি / সিরিয়ালাইজেশন সমর্থন করা উচিত। যদি এই প্রশ্নের জন্য না হয়, আমি এখনও ম্যানুয়ালি আমার অবিশ্বাস্যরকম জটিল
জসন ব্লবগুলি

16

এই কিউ আবার সময় এবং সময় পুনরাবৃত্তি করে - json মডিউলটি প্যাচ করার একটি সহজ উপায় যেমন সিরিয়ালাইজেশন ডেটটাইম সমর্থন করে।

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

এর ফলাফল: 'created "তৈরি": "2015-08-26T14: 21: 31.853855"}'

আরও বিশদ এবং সাবধানতার কিছু শব্দ এখানে দেখুন: স্ট্যাক ওভারফ্লো: পাইথন এবং জাভাস্ক্রিপ্টের মধ্যে জেএসওএন ডেটটাইম


বানরের প্যাচ এফটিডাব্লু। বাজে জিনিস অবশ্যই এটি আপনার পুরো অ্যাপ্লিকেশনটিতে জসন মডিউলটির আচরণকে পরিবর্তন করে, যা অন্যকে বড় অ্যাপ্লিকেশনটিতে চমকে দিতে পারে, তাই যত্ন সহকারে ইমো ব্যবহার করা উচিত।
জাপ ভার্সটিঘ

15

Json.dumps পদ্ধতিটি ডিফল্ট নামে পরিচিত একটি alচ্ছিক প্যারামিটার গ্রহণ করতে পারে যা কোনও ফাংশন হিসাবে প্রত্যাশিত। প্রতিবার JSON যখন কোনও মান রূপান্তর করার চেষ্টা করে তখন কীভাবে রূপান্তর করতে হয় তা জানে না আমরা যে ফাংশনটিতে এটি পাস করেছি তাকে কল করবে। ফাংশনটি প্রশ্নযুক্ত বস্তুটি গ্রহণ করবে এবং প্রত্যাশিত এটিটির জেএসওএন প্রতিনিধিত্ব প্রত্যাবর্তন করবে।

def myconverter(o):
 if isinstance(o, datetime.datetime):
    return o.__str__()

print(json.dumps(d, default = myconverter)) 

14

আপনি যদি পাইথন ৩..7 ব্যবহার করছেন তবে সর্বোত্তম সমাধানটি হ'ল datetime.isoformat()এবং datetime.fromisoformat(); তারা উভয় নিষ্পাপ এবং সচেতন datetimeবস্তুর সাথে কাজ করে:

#!/usr/bin/env python3.7

from datetime import datetime
from datetime import timezone
from datetime import timedelta
import json

def default(obj):
    if isinstance(obj, datetime):
        return { '_isoformat': obj.isoformat() }
    return super().default(obj)

def object_hook(obj):
    _isoformat = obj.get('_isoformat')
    if _isoformat is not None:
        return datetime.fromisoformat(_isoformat)
    return obj

if __name__ == '__main__':
    #d = { 'now': datetime(2000, 1, 1) }
    d = { 'now': datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=-8))) }
    s = json.dumps(d, default=default)
    print(s)
    print(d == json.loads(s, object_hook=object_hook))

আউটপুট:

{"now": {"_isoformat": "2000-01-01T00:00:00-08:00"}}
True

আপনি যদি পাইথন ৩..6 বা তার থেকে নীচে ব্যবহার করছেন এবং আপনি কেবলমাত্র সময় মূল্য (টাইমজোন নয়) সম্পর্কে যত্নশীল হন তবে আপনি ব্যবহার করতে পারেন datetime.timestamp()এবং datetime.fromtimestamp()পরিবর্তে;

আপনি যদি পাইথন ৩..6 বা তার থেকে নীচে ব্যবহার করছেন এবং আপনি টাইমজোনটি সম্পর্কে যত্নশীল হন তবে আপনি এটি মাধ্যমে পেতে পারেন, তবে আপনাকে নিজেরাই datetime.tzinfoএই ক্ষেত্রটি সিরিয়াল করতে হবে; এটি করার সবচেয়ে সহজ উপায় হ'ল _tzinfoসিরিয়ালযুক্ত বস্তুতে অন্য ক্ষেত্র যুক্ত করা ;

পরিশেষে, এই সমস্ত উদাহরণে নির্ভুলতা থেকে সাবধান থাকুন;


ডেটটাইম.আইসোফর্ম্যাট () পাইথন ২.7 এও উপস্থিত রয়েছে: ডকস.পিথন.অর্গ

11

এটিকে সিরিয়ালাইজযোগ্য পদ্ধতি হিসাবে তৈরি করতে আপনার .strftime()পদ্ধতিতে পদ্ধতি ব্যবহার করা উচিত ।.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[0]: {'a': 1, 'b': 2, 'time': '2017-10-31T15:16:30'}

10

"ডেটটাইম জেএসএন সিরিয়ালাইজযোগ্য নয়" সমস্যাটি ওভার করার জন্য এখানে একটি সহজ সমাধান।

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)

আউটপুট: -> date "তারিখ": "2015-12-16T04: 48: 20.024609"}


8

আপনাকে clsপ্যারামিটারের সাথে একটি কাস্টম এনকোডার শ্রেণি সরবরাহ করতে হবে 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', ']']

এটি উদাহরণ হিসাবে জটিল সংখ্যা ব্যবহার করে তবে আপনি তারিখগুলি এনকোড করার জন্য খুব সহজেই একটি শ্রেণি তৈরি করতে পারেন (আমি মনে করি জেএসওএন তারিখগুলি সম্পর্কে কিছুটা অস্পষ্ট)


5

এটি করার সহজ উপায় হ'ল ডেটের অংশটি যা ডেটটাইম ফর্ম্যাটে রয়েছে আইফর্মমেটে পরিবর্তন করা। এই মানটি কার্যকরভাবে আইসোফর্মেটের একটি স্ট্রিং হবে যা জেসন ঠিক আছে।

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

5

আসলে এটি বেশ সহজ। আপনার যদি প্রায়শই তারিখগুলি সিরিয়াল করার প্রয়োজন হয় তবে তার সাথে স্ট্রিং হিসাবে কাজ করুন। প্রয়োজন হলে আপনি এগুলিকে সহজেই ডেটটাইম অবজেক্ট হিসাবে রূপান্তর করতে পারেন।

আপনার যদি বেশিরভাগ ডেটটাইম অবজেক্ট হিসাবে কাজ করতে হয় তবে সিরিয়ালকরণের আগে সেগুলিকে স্ট্রিং হিসাবে রূপান্তর করুন।

import json, datetime

date = str(datetime.datetime.now())
print(json.dumps(date))
"2018-12-01 15:44:34.409085"
print(type(date))
<class 'str'>

datetime_obj = datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S.%f')
print(datetime_obj)
2018-12-01 15:44:34.409085
print(type(datetime_obj))
<class 'datetime.datetime'>

আপনি দেখতে পাচ্ছেন, উভয় ক্ষেত্রেই আউটপুট একই রকম। শুধু টাইপ আলাদা।


3

ফলাফলটি যদি আপনি কোন দৃশ্যে ব্যবহার করে থাকেন তবে অবশ্যই একটি যথাযথ প্রতিক্রিয়া ফিরিয়ে দিন। এপিআই অনুসারে, জসনফাইটি নিম্নলিখিতগুলি করে:

কোনও অ্যাপ্লিকেশন / জসন মাইম টাইপ সহ প্রদত্ত যুক্তিগুলির JSON উপস্থাপনের সাথে একটি প্রতিক্রিয়া তৈরি করে।

Json.dumps এর সাথে এই আচরণটি নকল করতে আপনাকে কয়েকটি অতিরিক্ত লাইন কোড যুক্ত করতে হবে।

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

Jsonify এর প্রতিক্রিয়া সম্পূর্ণরূপে প্রতিলিপি করতে আপনার একটি ডিকটিও ফেরানো উচিত। সুতরাং, পুরো ফাইলটি এর মতো দেখাবে

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

1
ফ্লাস্কের সাথে প্রশ্নের কোনও সম্পর্ক নেই।
জোড়ান পাভলভিক

2
প্রশ্নটি অজগর নিয়ে। আমার উত্তরটি পাইথন ব্যবহার করে প্রশ্নটি সমাধান করে। ওপিতে কিছু নির্দিষ্ট গ্রন্থাগার অন্তর্ভুক্ত করা উচিত বা বাদ দেওয়া উচিত কিনা তা বলেনি। এই বিকল্পটি পড়ার যে কারও বিকল্প চাই তার পক্ষে এটি দরকারী pymongo
পুনরায়

তারা প্রশ্ন দুটি পাইথন সম্পর্কে এবং ফ্লেস্ক সম্পর্কে নয় । আপনার প্রশ্নের উত্তরে ফ্লাস্কের প্রয়োজন নেই, তাই আমি আপনাকে এটি সরিয়ে দেওয়ার পরামর্শ দিই।
জোড়ান পাভলভিক

3

পার্স করার জন্য এটির উদাহরণ দিয়ে চেষ্টা করুন:

#!/usr/bin/env python

import datetime
import json

import dateutil.parser  # pip install python-dateutil


class JSONEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.isoformat()
        return super(JSONEncoder, self).default(obj)


def test():
    dts = [
        datetime.datetime.now(),
        datetime.datetime.now(datetime.timezone(-datetime.timedelta(hours=4))),
        datetime.datetime.utcnow(),
        datetime.datetime.now(datetime.timezone.utc),
    ]
    for dt in dts:
        dt_isoformat = json.loads(json.dumps(dt, cls=JSONEncoder))
        dt_parsed = dateutil.parser.parse(dt_isoformat)
        assert dt == dt_parsed
        print(f'{dt}, {dt_isoformat}, {dt_parsed}')
        # 2018-07-22 02:22:42.910637, 2018-07-22T02:22:42.910637, 2018-07-22 02:22:42.910637
        # 2018-07-22 02:22:42.910643-04:00, 2018-07-22T02:22:42.910643-04:00, 2018-07-22 02:22:42.910643-04:00
        # 2018-07-22 06:22:42.910645, 2018-07-22T06:22:42.910645, 2018-07-22 06:22:42.910645
        # 2018-07-22 06:22:42.910646+00:00, 2018-07-22T06:22:42.910646+00:00, 2018-07-22 06:22:42.910646+00:00


if __name__ == '__main__':
    test()

2

আমার সমাধান ...

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

2

তারিখের সময়টি JSON এবং পিছনে রূপান্তর করার জন্য আমার সম্পূর্ণ সমাধানটি এখানে ...

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}

এটি আমাকে স্ট্রিং, ইনটস, ফ্লোট এবং ডেটটাইম অবজেক্টগুলি আমদানি ও রফতানি করতে সক্ষম করেছে has অন্যান্য ধরণের জন্য প্রসারিত করা শক্ত হওয়া উচিত নয়।


1
এটি দিয়ে পাইথন 3 এ বিস্ফোরিত হয় TypeError: 'str' does not support the buffer interface। এটি 'wb'ওপেন মোডের কারণে হওয়া উচিত 'w'। যখন আমাদের কাছে তারিখের মতো ডেটা থাকে '0000891618-05-000338'তবে মেলে না।
ওমিক্রন


2

সাধারণত তারিখের সময়কে সিরিয়াল করার বিভিন্ন উপায় রয়েছে, যেমন:

  1. আইএসও স্ট্রিং, সংক্ষিপ্ত এবং টাইমজোন সম্পর্কিত তথ্য অন্তর্ভুক্ত করতে পারে, যেমন @ জেগবারarah উত্তর
  2. টাইমস্ট্যাম্প (টাইমজোন ডেটা হারিয়ে গেছে), যেমন @ জয়টায়লর উত্তর
  3. বৈশিষ্ট্যগুলির অভিধান (টাইমজোন সহ)।

আপনি যদি শেষের পথে ঠিক থাকেন তবে জসন_ট্রিক্স প্যাকেজটি সময় অঞ্চলগুলি সহ তারিখ, সময় এবং তারিখের সময়গুলি পরিচালনা করে।

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_tricksপরিবর্তে আমদানি করুনjson

এটিকে একটি একক স্ট্রিং, ইনট বা ফ্লোট হিসাবে সংরক্ষণ না করার সুবিধাটি ডিকোড করার সময় আসে: যদি আপনি কেবল একটি স্ট্রিং বা বিশেষত ইনট বা ফ্লোটের মুখোমুখি হন তবে এটি তারিখের সময় কিনা তা জানার জন্য আপনাকে ডেটা সম্পর্কে কিছু জানতে হবে। ডিক হিসাবে, আপনি মেটাটাটা সঞ্চয় করতে পারেন যাতে এটি স্বয়ংক্রিয়ভাবে ডিকোড হয়ে যায়, যা isjson_tricks আপনার পক্ষে হয়। এটি মানুষের পক্ষে সহজেই সম্পাদনাযোগ্য।

দাবি অস্বীকার: এটি আমার দ্বারা তৈরি করা হয়েছে। কারণ আমারও একই সমস্যা ছিল।


1

স্ক্ল্যাচলেমি সহ একটি ক্লাসের ভিতরে সিরিয়াল সাজসজ্জা লেখার সময় আমি একই ত্রুটি বার্তা পেয়েছি। এর পরিবর্তে:

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

আইগোফর্ম্যাট () ব্যবহার করার জন্য আমি জিগবারার ধারণাটি ধার করেছিলাম এবং আইসোফর্ম্যাট () দিয়ে মূল মান সংযোজন করেছি, যাতে এখন এটির মতো দেখতে:

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

1

আপনি যদি নিজের ফর্ম্যাটিং চান তবে একটি দ্রুত সমাধান

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

আপনি যদি যোগাযোগের উভয় পক্ষে থাকেন তবে আপনি json সহ repr () এবং eval () ফাংশন ব্যবহার করতে পারেন ।

import datetime, json

dt = datetime.datetime.now()
print("This is now: {}".format(dt))

dt1 = json.dumps(repr(dt))
print("This is serialised: {}".format(dt1))

dt2 = json.loads(dt1)
print("This is loaded back from json: {}".format(dt2))

dt3 = eval(dt2)
print("This is the same object as we started: {}".format(dt3))

print("Check if they are equal: {}".format(dt == dt3))

আপনার ডেটটাইম হিসাবে আমদানি করা উচিত নয়

from datetime import datetime

যেহেতু eval অভিযোগ করবে। অথবা আপনি তারিখের সময়টি প্যারামিটার হিসাবে প্রকাশ করতে পারেন। যে কোনও ক্ষেত্রে এটি কাজ করা উচিত।


0

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

0
def j_serial(o):     # self contained
    from datetime import datetime, date
    return str(o).split('.')[0] if isinstance(o, (datetime, date)) else None

উপরের ইউটিলিটির ব্যবহার:

import datetime
serial_d = j_serial(datetime.datetime.now())
if serial_d:
    print(serial_d)  # output: 2018-02-28 02:23:15

0

এই গ্রন্থাগারটি সুপারজসন এটি করতে পারে। এবং আপনি এই নির্দেশনাটি অনুসরণ করে আপনার নিজের পাইথন অবজেক্টের জন্য সহজেই জসন সিরিয়ালাইজ কাস্টম করতে পারেন https://superjson.readthedocs.io/index.html#extend

সাধারণ ধারণাটি হ'ল:

আপনার কোডে পাইথন অবজেক্টের উপর ভিত্তি করে সঠিক সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন পদ্ধতিটি সনাক্ত করা দরকার। সাধারণত, পুরো শ্রেণীর নামটি একটি ভাল শনাক্তকারী।

এবং তারপরে আপনার সের / ডিজার পদ্ধতিটি আপনার বস্তুকে নিয়মিত জসন সিরিয়ালাইজেবল অবজেক্টে জেনেরিক পাইথনের ধরণের, ডিক, তালিকা, স্ট্রিং, ইনট, ফ্লোটের সংমিশ্রণে সক্ষম করতে হবে। এবং বিপরীতভাবে আপনার প্রাপ্য পদ্ধতি বাস্তবায়ন।


-1

আমি 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'> 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.