Python中如何解析Django后端返回的JSON数据

前端 index.html 是这样写的:

            出发站点: <input type="text" name="a"> <br>
            目的站点: <input type="text" name="b"> <br>
            出发日期: <input type="text" name="c"> <br>
            <input type="submit" value="提交">
        </form>

后端 view->train 函数里是这样写返回数据的:

    from_station=stations.get(a)
    to_station=stations.get(b)
    date = c
    options = ''
    url = 'http://op.juhe.cn/trainTickets/ticketsAvailable?dtype=&train_date={}&from_station={}&to_station={}&key=d655088e9b37ad7f9b938ac6c17d7233'.format(
        date, from_station, to_station
    )
    print(from_station, to_station, date, options, url)
    """获取参数"""
    r = requests.get(url, verify=False)
    available_trains = r.json()['result']['list']
    return HttpResponse(available_trains)

然后输入数据点击提交后到新页面输出一堆乱七八糟的数据:

{'gjrws_price': 0, 'train_code': 'K829', 'yz_num': '0', 'ywz_price': 462.5, 'to_station_name': '广州', 'rz_num': '--', 'start_time': '10:10', 'ydz_price': 0, 'run_time': '43:00', 'run_time_minute': '2580', 'from_station_name': '成都', 'sale_date_time': '0900', 'rw_num': '0', 'rw_price': 704.5, 'wz_price': 263.5, 'train_start_date': '20170705', 'arrive_days': '2', 'dw_num': '--', 'dwx_price': 0, 'swz_num': '--', 'qtxb_num': '--', 'edz_price': 0, 'can_buy_now': 'Y', 'end_station_name': '广州', 'ydz_num': '--', 'yw_num': '0', 'tdz_num': '--', 'access_byidcard': '0', 'rz_price': 0, 'dw_price': 0, 'ywx_price': 477.5, 'swz_price': 0, 'wz_num': '104', 'tdz_price': 0, 'edz_num': '--', 'yz_price': 263.5, 'rwx_price': 735.5, 'gjrw_num': '--', 'yw_price': 446.5, 'start_station_name': '成都', 'from_station_code': 'CDW', 'gjrw_price': 0, 'train_no': '760000K8290E', 'to_station_code': 'GZQ', 'qtxb_price': 0, 'train_type': 'K', 'arrive_time': '05:10'}{'gjrws_price': 0, 'train_code': 'K1223', 'yz_num': '0', 'ywz_price': 462.5, 'to_station_name': '广州东', 'rz_num': '--', 'start_time': '13:00', 'ydz_price': 0, 'run_time': '44:19', 'run_time_minute': '2659', 'from_station_name': '成都', 'sale_date_time': '0900', 'rw_num': '0', 'rw_price': 704.5, 'wz_price': 263.5, 'train_start_date': '20170705', 'arrive_days': '2', 'dw_num': '--', 'dwx_price': 0, 'swz_num': '--', 'qtxb_num': '--', 'edz_price': 0, 'can_buy_now': 'Y', 'end_station_name': '广州东', 'ydz_num': '--', 'yw_num': '0', 'tdz_num': '--', 'access_byidcard': '0', 'rz_price': 0, 'dw_price': 0, 'ywx_price': 477.5, 'swz_price': 0, 'wz_num': '112', 'tdz_price': 0, 'edz_num': '--', 'yz_price': 263.5, 'rwx_price': 735.5, 'gjrw_num': '--', 'yw_price': 446.5, 'start_station_name': '成都', 'from_station_code': 'CDW', 'gjrw_price': 0, 'train_no': '76000K12230F', 'to_station_code': 'GGQ', 'qtxb_price': 0, 'train_type': 'K', 'arrive_time': '09:19'}

这个数据是以{}这个分开为一行,中间没有逗号,好像又不是标准的 json 数据。。。 百度了很多了。好像需要什么 eval 解析什么的,但是我还是不知道怎么把返回的这个数据赋值给前端的一个对象。。。 求那个大佬教教菜鸡,怎么把它正常输出像表格那样一行一行的。。。有代码就真的是感谢了


Python中如何解析Django后端返回的JSON数据

13 回复

试试
str.dict()
不行就
json.loads(str )


在Django后端返回JSON数据后,前端(通常是JavaScript)或另一个Python服务需要解析它。这里主要讲在Python中如何解析。

最常见的情况是用requests库调用Django API,然后解析返回的JSON。

import requests
import json

# 1. 发送GET请求到Django后端API
response = requests.get('http://your-django-server/api/some-endpoint/')

# 2. 检查请求是否成功
if response.status_code == 200:
    # 方法A:直接使用response.json(),这是最方便的方式
    data = response.json()  # 自动将JSON响应体解析为Python字典或列表
    print(f"解析后的数据(字典): {data}")
    
    # 你可以像操作普通字典一样访问数据
    if isinstance(data, dict):
        user_id = data.get('id')
        username = data.get('username')
        print(f"用户ID: {user_id}, 用户名: {username}")
    elif isinstance(data, list):
        for item in data:
            print(item)
            
    # 方法B:手动使用json模块(当response.json()不可用或需要更多控制时)
    # data_manual = json.loads(response.text)
    # print(data_manual)
    
else:
    print(f"请求失败,状态码: {response.status_code}")
    print(response.text)  # 查看原始响应内容

如果JSON字符串已经存在:

import json

json_string = '{"name": "Alice", "age": 30, "city": "New York"}'

# 解析JSON字符串为Python字典
parsed_data = json.loads(json_string)
print(parsed_data['name'])  # 输出: Alice
print(parsed_data.get('age'))  # 输出: 30

# 将Python对象转换回JSON字符串
new_json_string = json.dumps(parsed_data)
print(new_json_string)

关键点:

  • response.json()requests库的方法,适用于HTTP响应。
  • json.loads() 用于解析JSON字符串
  • json.load() 用于从文件对象读取JSON(比如从文件加载)。
  • 解析后得到的是Python字典(对应JSON对象)或列表(对应JSON数组),你可以用标准的字典/列表操作来访问数据。

注意异常处理:

try:
    data = response.json()
except json.JSONDecodeError as e:
    print(f"JSON解析失败: {e}")
    print(f"原始响应文本: {response.text}")

一句话总结:用response.json()json.loads(),然后当字典操作就行。

应该是用模板
<ul>
{% for key, value in available_trains.items %}
<li>{{ key }}: {{ value }}</li>
{% endfor %}
</ul>
返回的方式好像不对,应该用 render 渲染一个页面来显示吧
贴个教程 http://code.ziqiangxuetang.com/django/django-template2.html
我也还在学习,讲得很不错

我也是感觉我返回的好像不对。。。。看网上都是用的 render

还是不知道前端怎么获取返回。。。

我这个 available_train 好像是个 json 数据,不是 list 和 dict 也可以这样用吗

thinks so,我好像知道一点点,我这个 available_train 确实是个 list

需求就很奇怪,点击按钮后页面发生变化,不是该服务端返回 html 的吗?

如果要返回 json, 要设置 Context 类型 application/json

json.loads()

https://docs.djangoproject.com/en/1.11/ref/request-response/#jsonresponse-objects

JsonResponse objects
class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)[source]¶

return HttpResponse(json.dumps(…))

你的 appkey 泄露啦

后台 json.loads(str)一下就解析了,
建议学框架前系统好好学习 python 的基础知识,难道现在的技术人员都是成果驱动学习的?

回到顶部