2017-12-27 5 views
0

Ich bin ziemlich neu in Python und in meiner Anwendung verwende ich Neomodel zum Laden und Abrufen von Grafikdaten aus Neo4j-Datenbank.Python NeoModel wie Abfrageergebnis als JSON-Objekt zurückgeben

In einem meiner Routen habe ich die folgende Funktion:

@api_mod.route('/users')                
def get_users():                                       
    users = User.nodes #Returns a NodeSet                                
    list_of_users = list(users) #Converts the NodeSet object to a list                                                                  
    return json.dumps(dict(users = [user for user in list_of_users]))  

Meine Benutzerklasse wird wie folgt definiert:

class User(StructuredNode): 
    user_id = StringProperty(unique_index=True, required=True) 
    logged_in = RelationshipTo('Environment', 'LOGGED_IN', model=LoginAction) 
    launched = RelationshipTo('Application', 'LAUNCHED', model=LaunchedAction) 
    entered = RelationshipTo('Application', 'ENTERED', model=EnteredAction) 
    accessed = RelationshipTo('Application', 'ACCESSED', model=AccessedAction) 
    exited = RelationshipTo('Application', 'EXITED', model=ExitedAction) 
    logged_out = RelationshipTo('Environment', 'LOGGED_OUT', model=LogoutAction) 
    timed_out = RelationshipTo('Environment', 'TIME_OUT', model=TimeoutAction) 

    def toJSON(self): 
     return dict(user_id = self.user_id) 

Meine Erwartung ist, dass meine/Benutzer Route ein JSON-Objekt zurück mit allen Benutzern in der Datenbank. Ich verstehe, dass das NodeSet-Objekt nicht zu einem JSON-Objekt serialisierbar ist, daher versuche ich es in eine Liste zu konvertieren. Aber jetzt, wenn ich laufe ich die folgende Fehlermeldung erhalten: „Typeerror: Objekt vom Typ‚User‘ist nicht JSON serializable“

und hier ist der ganze Stack-Trace: Traceback (jüngste Aufforderung zuletzt): File " /Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py ", Zeile 1997, in Anruf zurückgeben self.wsgi_app (environ, start_response) Datei"/Benutzer/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py ", Zeile 1985, in wsgi_app Antwort = self.handle_exception (e) Datei" /Users/mdebarros/.virtualenvs/useractivitylogs /lib/python3.6/site-packages/flask/app.py ", Zeile 1540, in handle_exception reraise (exc_type, exc_value, tb) Datei "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/_compat.py", Zeile 33, in Reraise erhöhen Wert File "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py", Zeile 1982 in wsgi_app response = self.full_dispatch_request() Datei „/ Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/app.py ", Zeile 1614, in full_dispatch_request rv = self.handle_user_exception (e) Datei" /Users/mdebarros/.virtualenvs/useractivitylogs /lib/python3.6/site-packages/flask/app.py ", Zeile 1517, in handle_user_exception reraise (exc_type, exc_value, tb) File "/Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/site-packages/flask/_compat.py", Zeile 33, in Reraise raise Wert File „/Users/mdebarros/.virtualenvs/useractivitylogs /lib/python3.6/site-packages/flask/app.py ", Zeile 1612, in full_dispatch_request rv = self.dispatch_request() Datei" /Users/mdebarros/.virtualenvs/useractivitylogs/lib/python3.6/ site-packages/flask/app.py ", Zeile 1598, in dispatch_request return self.view_functionsrule.endpoint Datei" /Users/mdebarros/PycharmProjects/useractivitylogs/app/api/routes.py ", Zeile 16, in get_users return json.dumps (dict (users = [Benutzer für Benutzer in list_of_users]))) Datei "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ json/init .py ", Zeile 231, in Dumps zurückgeben _default_encoder.encode (obj) Datei" /usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3. 6/json/encoder.py ", Zeile 199, in encode chunks = self.iterencode (o, _ein_shot = True) Datei" /usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions /3.6/lib/python3.6/json/encoder.py ", Zeile 257, im Iterencode return _iterencode (o, 0) Datei" /usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework /Versions/3.6/lib/python3.6/json/encoder.py ", Zeile 180, standardmäßig o.Klasse. Name) Typeerror: Objekt vom Typ ‚User‘ ist nicht JSON serializable

Jede Hilfe oder Anregungen, wie ich damit umgehen kann und ein richtiges JSON-Objekt zurückgeben?

Vielen Dank im Voraus für jegliche Hilfe.

--MD

Antwort

0

wie Sie wissen, ist es notwendig, dass die Benutzerklasse Modell eine Methode hat den Prozess der Übersetzung von Datenstrukturen (Serialisierung) durchzuführen, zu lösen, wird eine Lösung ist, ein Verfahren hinzufügen das bedeutet dies:

class User(StructuredNode): 
    user_id = StringProperty(unique_index=True, required=True) 
    logged_in = RelationshipTo('Environment', 'LOGGED_IN', model=LoginAction) 
    launched = RelationshipTo('Application', 'LAUNCHED', model=LaunchedAction) 
    entered = RelationshipTo('Application', 'ENTERED', model=EnteredAction) 
    accessed = RelationshipTo('Application', 'ACCESSED', model=AccessedAction) 
    exited = RelationshipTo('Application', 'EXITED', model=ExitedAction) 
    logged_out = RelationshipTo('Environment', 'LOGGED_OUT', model=LogoutAction) 
    timed_out = RelationshipTo('Environment', 'TIME_OUT', model=TimeoutAction) 

@property 
def serialize(self): 
    return { 
     'user_id': self.user_id, 
     'logged_in': self.logged_in, 
     'launched': self.launched, 
     'entered': self.entered, 
     'accessed': self.accessed, 
     'exited': self.exited, 
     'logged_out': self.logged_out, 
     'timed_out' : self.timed_out 
    } 

Jetzt, da das Verfahren als Eigenschaft hinzugefügt wurde, kann als Attribut aufgerufen werden:

@api_mod.route('/users')                
def get_users():                                       
    users = User.nodes                                
    list_of_users = list(users) 
    return json.dumps(dict(json_users = [user.serialize for user in list_of_users])) 
+0

Danke @Coding, es funktionierte perfekt. Die einzige Änderung, die ich gemacht habe, falls jemand dies jemals in der Serialisierungsmethode benötigt, da ich nach Informationen über den Knoten selbst suche, habe ich nur die Eigenschaft user_id zurückgegeben, da alle anderen Beziehungen waren. – Cracoras

Verwandte Themen