खोज…


परिचय

कई अनुप्रयोगों में, 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>) 

विभिन्न विकल्पों का उपयोग करने के लिए, आप कर सकते हैं:

  1. DEFAULT_JSON_OPTIONS ऑब्जेक्ट को संशोधित करें। इस मामले में, विकल्प का उपयोग सभी बाद की कॉल के लिए dumps करने के लिए किया जाएगा:

     from bson.json_util import DEFAULT_JSON_OPTIONS
     DEFAULT_JSON_OPTIONS.datetime_representation = 2
     dumps(record)
    
  2. 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"}'


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow