如何在Python中使用JSON响应?

时间:2015-12-19 03:30:36

标签: python json django django-views

我正在创建一个Django Web应用程序。 有一个函数可以创建一个像这样的JSON响应:

def rest_get(request, token):
    details = Links.get_url(Links, token)
    result={}
    if len(details)>0:
            result['status'] = 200
            result['status_message'] = "OK"
            result['url'] = details[0].url
    else:
            result['status'] = 404
            result['status_message'] = "Not Found"
            result['url'] = None

    return JsonResponse(result)

我在网络浏览器中得到的答案如下:

{"status": 200, "url": "http://www.bing.com", "status_message": "OK"}

现在从另一个函数我想要使用该响应并从中提取数据。我该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以使用python中的json库来完成您的工作。例如:

json_string = '{"first_name": "tom", "last_name":"harry"}'
import json
parsed_json = json.loads(json_string)
print(parsed_json['first_name'])
"tom" 

您已经创建了一个Web应用程序。我假设您已经公开了一个URL,您可以从中获得JSON响应,例如http://jsonplaceholder.typicode.com/posts/1

import urllib2
import json
data = urllib2.urlopen("http://jsonplaceholder.typicode.com/posts/1").read()
parsed_json = json.loads(data)

urlopen函数在给定的URL上发送HTTP GET请求。 parsed_json是类型映射的变量,您可以从中提取所需的数据。

print parsed_json['userId']
1

答案 1 :(得分:1)

我想建议的答案有点不同。在你的场景中 - 需要从服务器端和客户端都访问一个功能,我建议提供一些额外的参数并根据它改变输出。这减少了开销和不必要的转换。

例如,如果传入一个额外的参数并像这样更改结果,则不需要在python上进行JSON解析。当然有解决方案可以做到这一点,但为什么需要转换为json然后解析,当你可以完全避免

def rest_get(request, token, return_json=True):

    details = Links.get_url(Links, token)
    result={}
    if len(details)>0:
            result['status'] = 200
            result['status_message'] = "OK"
            result['url'] = details[0].url
    else:
            result['status'] = 404
            result['status_message'] = "Not Found"
            result['url'] = None
    if return_json: # this is web response, so by default return_json = True
        return JsonResponse(result)
    return result

然后在你的python代码调用中 -

rest_get(request, token, return_json=False): # we are passing False, so the return type is dictionary and we can use it right away.

答案 2 :(得分:0)

您可以在json字符串上使用literal_eval将其解析为dict。

from ast import literal_eval
#data recieved 
responseText = '{"status": 200, "url": "http://www.bing.com", "status_message": "OK"}'

#dict response 
response = literal_eval(responseText)

print(response)
# -> {"status": 200, "url": "http://www.bing.com", "status_message": "OK"}

print(response['url'])
# -> http://www.bing.com

literal_evalastAbstract Syntax Trees)模块的一部分。你可以用它来:

  

安全地评估表达式节点或Unicode或Latin-1编码   包含Python文字或容器显示的字符串。字符串或   提供的节点可能只包含以下Python文字   结构:字符串,数字,元组,列表,dicts,布尔值和   无。