2017-07-17 147 views
2

我有一個簡單的服務器from here,當GET函數被調用時,我想它在下面的相關代碼段返回一個JSON文件,如顯示返回:使用JSON GET請求從服務器

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) 

我的JSON文件:

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

請求文件(client.py)申請:

import requests 
import json 

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

但是,試圖運行client.py我收到以下錯誤時:

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

我是正確加載test.json文件中的do_GET功能?不需要

感謝您的幫助:)

+2

爲什麼您的服務器上解析JSON,如果你想送它回給客戶?只要用open('test.json')做data_file:self.wfile.write(data_file.read())' – zwer

+0

它現在可以工作了,謝謝!我知道我是在做一個尷尬的方式:/隨意提交它作爲答案! – monadoboi

回答

4

取代它讓我們有點一個答案:)

更好的整體問題是,你在您的服務器上解析test.json,然後將它的字符串表示形式打印到客戶端。舉一個簡單的JSON,如:

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

當你加載和分析它作爲JSON,然後打印出來,你會得到一個Python dict它被解析爲,它們雖然很相似,是一個字符串表示不再JSON:

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)` 

這將產生(關於Python 2.x中,關於Python 3.X沒有統一標誌,但其餘的是相同的):

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

這就是你怎麼樣數據獲取從服務器發送 - 作爲Python dict的字符串表示形式。請注意,例如,那些表示unicode字符串的u前綴?那些是罪魁禍首(在這種情況下)。

現在,如果你要加載它,並嘗試分析它的JSON:

import json 

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

你會得到你的ValueError: Expecting property name: line 1 column 2 (char 1)錯誤。

爲了避免這種情況,不分析你的JSON,如果你想通過它發送給你的客戶,所以一個簡單的

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

應該足夠了。如果你需要做一些預處理到您的JSON,那麼你需要在發送之前序列化回JSON,如:

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

json.loaddata_file.read()

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