PyMongo
BSON और JSON के बीच रूपांतरण
खोज…
परिचय
कई अनुप्रयोगों में, MongoDB के रिकॉर्ड को JSON प्रारूप में क्रमांकित किया जाना चाहिए। यदि आपके रिकॉर्ड में टाइप डेट, डेटाइम, ऑब्जेक्टआईड, बाइनरी, कोड इत्यादि के क्षेत्र हैं, तो आप टाइप करेंगे TypeError: not JSON serializable
json.dumps
का उपयोग करते समय TypeError: not JSON serializable
json.dumps
अपवाद TypeError: not JSON serializable
। यह विषय बताता है कि इस पर कैसे काबू पाया जाए।
Json_util का उपयोग करना
json_util दो सहायक विधियां, dumps
और loads
प्रदान करता है, जो कि देशी json विधियों को लपेटता है और json से और इसके लिए स्पष्ट BSON रूपांतरण प्रदान करता है।
सरल उपयोग
from bson.json_util import loads, dumps
record = db.movies.find_one()
json_str = dumps(record)
record2 = loads(json_str)
यदि record
है:
{
"_id" : ObjectId("5692a15524de1e0ce2dfcfa3"),
"title" : "Toy Story 4",
"released" : ISODate("2010-06-18T04:00:00Z")
}
तब json_str
बन जाता है:
{
"_id": {"$oid": "5692a15524de1e0ce2dfcfa3"},
"title" : "Toy Story 4",
"released": {"$date": 1276833600000}
}
JSONOptions
एक JSONOptions
ऑब्जेक्ट के माध्यम से dumps
के व्यवहार को अनुकूलित करना संभव है। विकल्पों के दो सेट पहले से ही उपलब्ध हैं: DEFAULT_JSON_OPTIONS
और STRICT_JSON_OPTIONS
।
>>> bson.json_util.DEFAULT_JSON_OPTIONS
JSONOptions(strict_number_long=False, datetime_representation=0,
strict_uuid=False, document_class=dict, tz_aware=True,
uuid_representation=PYTHON_LEGACY, unicode_decode_error_handler='strict',
tzinfo=<bson.tz_util.FixedOffset object at 0x7fc168a773d0>)
विभिन्न विकल्पों का उपयोग करने के लिए, आप कर सकते हैं:
DEFAULT_JSON_OPTIONS
ऑब्जेक्ट को संशोधित करें। इस मामले में, विकल्प का उपयोग सभी बाद की कॉल के लिएdumps
करने के लिए किया जाएगा:from bson.json_util import DEFAULT_JSON_OPTIONS DEFAULT_JSON_OPTIONS.datetime_representation = 2 dumps(record)
json_options
पैरामीटर का उपयोग करdumps
करने के लिए कॉल मेंJSONOptions
निर्दिष्ट करें:# using strict dumps(record, json_options=bson.json_util.STRICT_JSON_OPTIONS) # using a custom set of options from bson.json_util import JSONOptions options = JSONOptions() # options is a copy of DEFAULT_JSON_OPTIONS options.datetime_representation=2 dumps(record, json_options=options)
JSONOptions
पैरामीटर हैं:
- सख्त_नंबर_लॉन्ग : यदि सही है, तो Int64 ऑब्जेक्ट्स MongoDB विस्तारित JSON के स्ट्रिक्ट मोड प्रकार नंबरलॉन्ग, अर्थात
{"$numberLong": "<number>" }
। अन्यथा उन्हें एक इंट के रूप में कूटबद्ध किया जाएगा। झूठा करने के लिए चूक। - datetime_repretation : datetime.datetime के एन्कोडिंग उदाहरणों का उपयोग करने के लिए प्रतिनिधित्व। 0 =>
{"$date": <dateAsMilliseconds>}
, 1 =>{"$date": {"$numberLong": "<dateAsMilliseconds>"}}
, 2 =>{"$date": "<ISO-8601>"}
- hard_uuid : यदि सही है, uuid.UUID ऑब्जेक्ट MongoDB विस्तारित JSON के स्ट्रिक्ट मोड बाइनरी के लिए एन्कोडेड है। अन्यथा इसे
{"$uuid": "<hex>" }
रूप में एन्कोड किया जाएगा। झूठा करने के लिए चूक। - document_class : BSON दस्तावेज़ों को लोड के द्वारा लौटाया गया है () इस वर्ग के उदाहरण के लिए डिकोड किया जाएगा। संग्रह का एक उपवर्ग होना चाहिए। तानाशाही के लिए चूक।
- uuid_repretation : uuid.UUID के एन्कोडिंग और डिकोडिंग इंस्टेंस के उपयोग के लिए BSON प्रतिनिधित्व। PYTHON_LEGACY में कमी।
- tz_aware : यदि सही है, MongoDB विस्तारित JSON के सख्त मोड प्रकार तिथि को समय-समय पर अवगत कराया जाएगा, जिसमें datetime.datetime के जागरूक उदाहरण हैं। अन्यथा वे अनुभवहीन होंगे। असत्य का दोष।
- tzinfo : एक
datetime.tzinfo
उपवर्ग जो समय क्षेत्र को निर्दिष्ट करता है जिसमें से डेटाइम ऑब्जेक्ट्स को डिकोड किया जाना चाहिए। Utc के लिए चूक।
अजगर- bsonjs का उपयोग करना
अजगर-bsonjs PyMongo पर निर्भर नहीं करता और अधिक एक अच्छा प्रदर्शन में सुधार की पेशकश कर सकते json_util
:
bsonjs लगभग 10-15x तेजी से PyMongo के json_util की तुलना में BSON से JSON तक और JSON से BSON को एन्कोडिंग करता है।
ध्यान दें कि:
- प्रभावी ढंग से bsonjs का उपयोग करने के लिए, यह सीधे
RawBSONDocument
साथ काम करने की सिफारिश की जाती है -
{"$date": <dateAsMilliseconds>}
अभ्यावेदन का उपयोग करते हुए दिनांक एन्कोड किए गए हैं,{"$date": <dateAsMilliseconds>}
। वर्तमान में इसे बदलने का कोई विकल्प नहीं है।
स्थापना
pip install python-bsonjs
प्रयोग
Bsonjs का पूरा फायदा उठाने के लिए, डेटाबेस को RawBSONDocument
वर्ग का उपयोग करने के लिए कॉन्फ़िगर करें। फिर, बन्स कच्चे बाइट्स को जेन्स में बदलने के लिए dumps
का उपयोग करें और रॉ बाइट्स में जंस को बदलने के लिए loads
करें:
import pymongo
import bsonjs
from pymongo import MongoClient
from bson.raw_bson import RawBSONDocument
# configure mongo to use the RawBSONDocument representation
db = pymongo.MongoClient(document_class=RawBSONDocument).samples
# convert json to a bson record
json_record = '{"_id": "some id", "title": "Awesome Movie"}'
raw_bson = bsonjs.loads(json_record)
bson_record = RawBSONDocument(raw_bson)
# insert the record
result = db.movies.insert_one(bson_record)
print(result.acknowledged)
# find some record
bson_record2 = db.movies.find_one()
# convert the record to json
json_record2 = bsonjs.dumps(bson_record2.raw)
print(json_record2)
कस्टम हैंडलर के साथ json मॉड्यूल का उपयोग करना
यदि आप सभी की जरूरत जोंस में mongo परिणाम serializing है, यह json
मॉड्यूल का उपयोग करने के लिए संभव है, बशर्ते आप गैर-धारावाहिक क्षेत्रों के प्रकार से निपटने के लिए कस्टम हैंडलर को परिभाषित करें। एक फायदा यह है कि आपके पास पूरी शक्ति है कि आप विशिष्ट क्षेत्रों को कैसे एन्कोड करते हैं, जैसे डेटाइम प्रतिनिधित्व।
यहाँ एक हैंडलर है जो आइसो प्रतिनिधित्व और एक हेक्साडेसिमल स्ट्रिंग के रूप में आईडी का उपयोग करते हुए दिनांक एनकोड करता है:
import pymongo
import json
import datetime
import bson.objectid
def my_handler(x):
if isinstance(x, datetime.datetime):
return x.isoformat()
elif isinstance(x, bson.objectid.ObjectId):
return str(x)
else:
raise TypeError(x)
db = pymongo.MongoClient().samples
record = db.movies.find_one()
# {u'_id': ObjectId('5692a15524de1e0ce2dfcfa3'), u'title': u'Toy Story 4',
# u'released': datetime.datetime(2010, 6, 18, 4, 0),}
json_record = json.dumps(record, default=my_handler)
# '{"_id": "5692a15524de1e0ce2dfcfa3", "title": "Toy Story 4",
# "released": "2010-06-18T04:00:00"}'