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。Django的JsonResponseHttpResponse with content_type='application/json'返回的数据可以直接用.json()方法解析。

示例场景:一个Python客户端调用Django API

假设你的Django有一个视图返回JSON数据:

# Django 视图 (views.py)
from django.http import JsonResponse

def my_api_view(request):
    data = {
        'user': 'John Doe',
        'age': 30,
        'skills': ['Python', 'Django', 'JavaScript']
    }
    return JsonResponse(data)

在另一个Python脚本或服务中,你可以这样获取并解析数据:

import requests

# 1. 发送GET请求到Django端点
response = requests.get('http://your-django-site.com/api/my-view/')

# 2. 检查请求是否成功
if response.status_code == 200:
    # 3. 直接使用 .json() 方法将响应内容解析为Python字典
    data_dict = response.json()
    
    # 4. 现在可以像使用普通字典一样访问数据
    print(f"User: {data_dict['user']}")
    print(f"Age: {data_dict['age']}")
    print(f"First skill: {data_dict['skills'][0]}")
    
    # 或者遍历skills
    for skill in data_dict['skills']:
        print(f"Skill: {skill}")
else:
    print(f"Request failed with status code: {response.status_code}")

如果响应内容是字符串,使用json.loads()

有时你可能直接拿到JSON格式的字符串(例如从文件读取或某些网络库返回文本),可以用标准库的json模块:

import json

# 假设这是你得到的字符串
json_string = '{"user": "John Doe", "age": 30, "skills": ["Python", "Django"]}'

# 使用 json.loads() 解析字符串
parsed_data = json.loads(json_string)
print(parsed_data['user'])  # 输出: John Doe

核心就是两点:对于requests的响应对象用.json()方法;对于JSON字符串用json.loads()

总结:用.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 的基础知识,难道现在的技术人员都是成果驱动学习的?

回到顶部