2012-07-01 15 views
10

नहीं है मुझे मोंगोड और पायथन (फ्लास्क) के साथ कुछ परेशानी हो रही है।ऑब्जेक्ट JSON serializable

मेरे पास यह api.py फ़ाइल है, और मैं सभी अनुरोध और प्रतिक्रिया JSON में होना चाहता हूं, इसलिए मैं इस तरह कार्यान्वित करता हूं।

# 
# Imports 
# 

from datetime import datetime 
from flask import Flask 
from flask import g 
from flask import jsonify 
from flask import json 
from flask import request 
from flask import url_for 
from flask import redirect 
from flask import render_template 
from flask import make_response 
import pymongo 
from pymongo import Connection 
from bson import BSON 
from bson import json_util 

# 
# App Create 
# 

app = Flask(__name__) 
app.config.from_object(__name__) 

# 
# Database 
# 

# connect 
connection = Connection() 
db = connection['storage'] 
units = db['storage'] 


# 
# Request Mixins 
# 

@app.before_request 
def before_request(): 
    #before 
    return 

@app.teardown_request 
def teardown_request(exception): 
    #after 
    return 


# 
# Functions 
# 

def isInt(n): 
    try: 
     num = int(n) 
     return True 
    except ValueError: 
     return False 

def isFloat(n): 
    try: 
     num = float(n) 
     return True 
    except ValueError: 
     return False 

def jd(obj): 
    return json.dumps(obj, default=json_util.default) 

def jl(obj): 
    return json.loads(obj, object_hook=json_util.object_hook) 

# 
# Response 
# 

def response(data={}, code=200): 
    resp = { 
     "code" : code, 
     "data" : data 
    } 
    response = make_response(jd(resp)) 
    response.headers['Status Code'] = resp['code'] 
    response.headers['Content-Type'] = "application/json" 
    return response 


# 
# REST API calls 
# 

# index 
@app.route('/') 
def index(): 
    return response() 

# search 
@app.route('/search', methods=['POST']) 
def search(): 
    return response() 

# add 
@app.route('/add', methods=['POST']) 
def add(): 
    unit = request.json 
    _id = units.save(unit) 
    return response(_id) 

# get 
@app.route('/show', methods=['GET']) 
def show(): 
    import pdb; pdb.set_trace(); 
    return response(db.units.find()) 

# 
# Error handing 
# 

@app.errorhandler(404) 
def page_not_found(error): 
    return response({},404) 


# 
# Run it! 
# 

if __name__ == '__main__': 
    app.debug = True 
    app.run() 

समस्या यहां जेसन एन्कोडिंग डेटा और मोंगो से आ रही है। ऐसा लगता है कि मैं request.json को सहेजने के लिए शब्दकोश के रूप में पास करके एड रूट को "हैक" करने में सक्षम हूं, इसलिए यह अच्छा है ... समस्या है/दिखाएं। यह कोड काम नहीं करता है ... जब मैं कुछ लॉगिंग करता हूं तो मुझे

TypeError: <pymongo.cursor.Cursor object at 0x109bda150> is not JSON serializable 

कोई विचार? मैं शेष कोड पर किसी भी सुझाव का भी स्वागत करता हूं, लेकिन जेएसओएन मुझे मार रहा है।

अग्रिम धन्यवाद!

+0

मैं सिर्फ त्रुटि है कि मुझे इस प्रश्न और समाधान करने के लिए यहाँ नेतृत्व जोड़ना चाहते हैं 'dict'' –

उत्तर

11

जब आप पारित db.units.find()response करने के लिए आप json.dumps करने के लिए एक pymongo.cursor.Cursor वस्तु पारित ... और json.dumps कैसे JSON करने के लिए इसे क्रमानुसार करने नहीं जानता है। कर्सर पुनरावृत्ति इसके परिणाम प्राप्त करने के द्वारा वास्तविक वस्तुओं हो रही का प्रयास करें:

[doc for doc in db.units.find()] 
+0

यह –

+0

@YisraelDov काम करने के लिए प्रतीत नहीं होता है - आप एक ही है ओपी के रूप में सेटअप? ध्यान दें कि वह 'json.dumps (obj, default = json_util.default)' का उपयोग कर रहा है, न कि सिर्फ 'json.dumps (obj) '। –

+0

जब मैं 'db.units.find() [:] 'करता हूं' यह हमेशा मुझे कर्सर ऑब्जेक्ट देता है। मैं बस एक सरणी के माध्यम से लूपिंग और जोड़ने के समाप्त हो गया, और फिर यह काम किया। –

4

JSON के लिए MongoDB दस्तावेजों सांकेतिक शब्दों में बदलना करने के लिए, मैं एक जो नीचे bson.objectid.ObjectId और datetime.datetime प्रकार को शामिल किया गया करने के लिए एक समान दृष्टिकोण का उपयोग करें।

class CustomEncoder(json.JSONEncoder): 
    """A C{json.JSONEncoder} subclass to encode documents that have fields of 
    type C{bson.objectid.ObjectId}, C{datetime.datetime} 
    """ 
    def default(self, obj): 
     if isinstance(obj, bson.objectid.ObjectId): 
      return str(obj) 
     elif isinstance(obj, datetime.datetime): 
      return obj.isoformat() 
     return json.JSONEncoder.default(self, obj) 

enc = CustomEncoder() 
enc.encode(doc) 

कर्सर के लिए, आपको इसे फिर से शुरू करने और दस्तावेज़ प्राप्त करने की आवश्यकता है।

26

जबकि @ ईरेनगुवेन आपको इस जेसन सीरियलाइजिंग मुद्दे को हल करने के लिए एक अच्छा मैनुअल दृष्टिकोण दिखाता है, पिमोंगो utility to accomplish this for you के साथ आता है। मैं अपने खुद के Django MongoDB परियोजना में इस का उपयोग करें:

import json 
from bson import json_util 

json_docs = [] 
for doc in cursor: 
    json_doc = json.dumps(doc, default=json_util.default) 
    json_docs.append(json_doc) 

या बस:

json_docs = [json.dumps(doc, default=json_util.default) for doc in cursor] 

और उनमें json से फिर से वापस पाने के लिए:

docs = [json.loads(j_doc, object_hook=json_util.object_hook) for j_doc in json_docs] 

सहायक उपयोगिताओं json बताओ कैसे करने के लिए कस्टम mongodb वस्तुओं को संभाल लें। `लेखन त्रुटि:: unhashable प्रकार:

+0

आप देख सकते हैं कि मैं इसका भी उपयोग कर रहा हूं, मेरी समस्या कर्सर के माध्यम से फिर से शुरू हो रही थी! धन्यवाद हालांकि :) – willium

+0

'pymongo आयात json_util' से बहिष्कृत किया गया है। इसके बजाय 'bson आयात json_util' से 'का उपयोग करें। – super9

+0

इसे फिक्स्ड। धन्यवाद! – jdi

5
import json 
from bson import json_util 

docs_list = list(db.units.find()) 
return json.dumps(docs_list, default=json_util.default) 
संबंधित मुद्दे