Python字典带有一个额外的花括号,作为JSON键,通过HttpResponse

时间:2015-06-02 10:16:07

标签: python json django dictionary

我通过GET请求向Django服务器发送特定的JSON。 JSON如下。

data = {
            test1: [1, 2, 3, 4],
            test2: {
                test21: ['a', 'b'],
                test22: 'data22'
            }
        };

编辑2:发送数据的代码:

string = JSON.stringify(data)
url = 'http://127.0.0.1:8000/calc/?' + string
$http.get(url).success(function(response) {console.log(response)});

编辑结束2

在我stringify之后发送它,我在请求数据上运行以下代码。

def calc (request):
    data = request.GET
    z = dict(data.iterlists())
    res = json.dumps(z)
    return HttpResponse(res)

http响应如下:

Object {{"test1":[1,2,3,4],"test2":{"test21":["a","b"],"test22":"data22"}}: Array[1]}

Array [1]元素基本上是一个空数组,所以没用。 当我将代码中的第三行更改为

z = dict(data.iteritems())

我得到以下回复

Object {{"test1":[1,2,3,4],"test2":{"test21":["a","b"],"test22":"data22"}}: ""}

基本上我需要的JSON是另一个JSON的关键。我知道我可以使用Object.keys()方法提取所需的JSON,但我希望响应是正确的。

如何在python中修复此问题?

编辑1:我认为当我将数据转换为第3行的dict项时出现错误。我认为这是因为z上的操作,应该是dict投掷错误。例如y = z['test1']会抛出错误。

2 个答案:

答案 0 :(得分:2)

查看this文章。

具体来说,

return HttpResponse(res, content_type = "application/json")

您错过了content_type限定符。

此外,你真的应该使用serializers.serialize之类的

def calc(request):
  data = request.GET
  return HttpResponse(serializers.serialize("json", data), 
    content_type = 'application/json')

答案 1 :(得分:2)

您发送数据的方式有点不对劲。

当您使用GET时,网址如下:

http://127.0.0.1:8000/?key1=value1&key2=value2

您上面所做的实际上使json字符串成为而不是。因此错误的请求格式。

我认为你需要做的是:

url = 'http://127.0.0.1:8000/calc/?payload=' + string

这将使payload键和您的实际字符串成为值。并检索它:

data = request.GET
json_string = data['payload']
# load the string