序列化:将内存对象转化成字节数据(可存储/传输的形式)
相反的过程(从字节数据中提取数据结构)称为反序列化
#在后端,即Python代码部分:通常使用json模块
json.dumps(<x>):将内存对象转换为JSON str
#仅能用于Python的基本数据类型
json.loads(<data>):将JSON str转换为内存对象(提取数据结构)
JSON.parse()参见:
https://www.runoob.com/js/javascript-json-parse.html
JSON.stringify()参见:
https://www.runoob.com/js/javascript-json-stringify.html
//在前端,即JS代码部分:
JSON.parse(<text>[,<reviver>]):将JSON str转换为内存对象
//参数说明:
text:指定JSON str
reviver:1个用于转换结果的函数,将对转换后的对象中的每个成员调用此函数
JSON.stringify(<obj>[,<replacer>,<space>]):将内存对象转换为JSON str
//参数说明:
obj:指定内存对象
replacer:用于转换结果的函数/数组
space:添加缩进/空格/换行符
如果为num,则返回值在每个级别缩进指定数目的空格(如>10,相当于10)
也可以为非数字,如:\t
#views.py:
from django.shortcuts import render,redirect,HttpResponse
from app01 import models
import json
from django.core import serializers
#返回页面:
def ser(req):
return render(req,"ser.html")
#返回页面上的数据:
def get_data(req):
ret={"status":True,"data":None}
try:
#如果是通过render()发送页面+数据:
#user_list=models.UserInfo.objects.all()
#如果是通过HttpResponse()只发送数据:
#1.如果QuerySet内部不是Python的基本数据类型:
#user_list=models.UserInfo.objects.all()#为QuerySet
#该方式仅在内部非Python基本数据类型(如为Datetime)时使用
#ret["data"]=serializers.serialize("json",user_list)
#第1个参数表示序列化成什么格式(此处是json)
#第2个参数表示要序列化什么(此处是user_list)
#serializers只能序列化QuerySet
#2.如果QuerySet内部是Python的基本数据类型:
user_list=models.UserInfo.objects.all().values("id","username")
#user_list内部是1个个dict(如果内部是tuple同理)
ret["data"]=list(user_list)#将QuerySet转换成list
except Exception as e:
ret["status"]=False
#return render(req,"get_data.html",{"user_list":user_list})
#返回的是页面+数据构成的str
#缺点:需要返回整个页面,当页面很庞大时,效率低下,故不常用
result=json.dumps(ret)
#json无法序列化QuerySet,故需要先用.seiralize()序列化user_list
return HttpResponse(result)
#只返回数据构成的str.不返回页面内容
<!--ser.html:-->
<body>
<h4>用户列表</h4>
<table id="tb">
</table>
<script src="/static/jquery-3.1.1.js"></script>
<script>
$(function () {
initData()
})
function initData() {
$.ajax({
url:"/get_data",
type:"GET",
dataType:"JSON",
success:function (arg) {
//如果是通过render()发送页面+数据:
//$("#tb").append(arg)
//如果是通过HttpResponse()只发送数据:
if(arg.status) {
//1.如果序列化了2次:
//此时arg.data是json,需要反序列化
//var v=JSON.parse(arg.data);
//console.log(v);
//2.如果只序列号了1次:
console.log(arg.data);
}
}
})
}
</script>
<body>
<!--get_data.html:-->
{% for row in user_list %}
<tr>
<td>{{row.id}}</td>
<td>{{row.username}}</td>
<td>{{row.email}}</td>
</tr>
{% endfor %}