2017-07-17 152 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)