2017-07-17 3 views
2

mit Ich habe einen einfachen Server from here, und wenn die GET-Funktion aufgerufen wird, ich möchte es eine JSON-Datei zurückzukehren, als zeigen in den entsprechenden Code-Schnipsel unter:Rückkehr JSON eine GET-Anforderung von Server

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
import json 

class S(BaseHTTPRequestHandler): 
    def _set_headers(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'application/json') 
     self.end_headers() 

    def do_GET(self): 
     self._set_headers() 
     with open('test.json') as data_file:  
      data = json.load(data_file) 
     self.wfile.write(data) 

Meine jSON-Datei:

{"foo": "bar", "boo": "far"} 

die Anwendung die Datei (client.py) anfordert:

import requests 
import json 

r = requests.get('http://localhost:8080') 
print r.json() 

jedoch bei dem Versuch, client.py ich die folgende Fehlermeldung erhalten auszuführen:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 

Bin ich die test.json Datei in der do_GET Funktion richtig geladen?

Vielen Dank für Ihre Hilfe :)

+2

Warum Sie die JSON auf dem Server parsen, wenn Sie es zurück liefern wollen an den Client? Mach einfach 'mit open ('test.json') als data_file: self.wfile.write (data_file.read())' – zwer

+0

Es funktioniert jetzt, danke! Ich wusste, dass ich es auf eine unangenehme Weise mache:/Fühle mich frei, es als Antwort einzureichen! – monadoboi

Antwort

4

Sagen wir es ein bisschen besser auf eine Antwort machen ersetzen sie gebraucht :)

Das ganze Problem, dass Sie ist Analysieren Sie test.json in Ihrem Server und drucken Sie dann eine String-Darstellung davon auf Ihrem Client. Betrachten wir ein einfaches JSON wie:

{"foo": "bar", "baz": "far"}

Wenn Sie es als JSON laden und analysieren, und dann drucken, werden Sie eine String-Darstellung eines dict Python bekommen es in analysiert wurde, die zwar sehr ähnlich ist JSON nicht mehr:

import json 

data = '{"foo": "bar", "baz": "far"}' # we'll use a string instead of a file for testing 
parsed = json.loads(data) 
print(parsed) # equivalent to printing `str(parsed)` 

Welche ergeben wird (auf Python 2.x auf Python 3.x gibt es keine Unicode-Markierungen, aber der Rest ist gleich):

{u'foo': u'bar', u'baz': u'far'}

Und das ist, wie Sie Ihre Daten werden vom Server gesendet - als String-Darstellung eines Python dict. Beachten Sie zum Beispiel, dass diese u Präfixe eine Unicode-Zeichenfolge bezeichnen? Das sind die Schuldigen (in diesem Fall). Jetzt

, wenn Sie es zurück zu laden sind und versuchen, es als JSON zu analysieren:

import json 

data = "{u'foo': u'bar', u'baz': u'far'}" 
parsed = json.loads(data) 

Sie würden Ihre ValueError: Expecting property name: line 1 column 2 (char 1) Fehler.

Um zu vermeiden, dass Sie nicht Ihre JSON analysieren, wenn Sie es über Ihre Client senden möchten, so dass eine einfache:

with open('test.json') as data_file: 
    self.wfile.write(data_file.read()) 

sollte ausreichen. Falls Sie eine Vorverarbeitung zu Ihrem JSON tun müssen, dann müssen Sie es zurück zu JSON serialisiert vor dem Senden, zum Beispiel:

with open('test.json') as data_file:  
    data = json.load(data_file) 
    data["boo"] = "baz" 
    self.wfile.write(json.dumps(data)) 
2

json.load nicht mit data_file.read()

def do_GET(self): 
    self._set_headers() 
    with open('test.json') as data_file:  
     data = data_file.read() 
    self.wfile.write(data)