JSON学习笔记
一JSON介绍
JSON:JavaScript Object Notation
JS 对象 表现方式
以JS对象的格式来约束前后端交互的字符串数据
二JSO-JS对象
使用 JS 对象表示一个人的信息,包含如下属性:
姓名:wangwc
年龄:30
身高:180
体重:180
var obj = {
name:"wangwc",
age:30,
height:180,
weight:180
}
console.log("姓名:"+obj.name);
三JSON规范
1.使用JSON表示单个对象
使用 {} 表示一个对象
在 {} 中使用key:value来表示属性(数据)
key必须使用""引起来
value如果是字符串的话,也必须使用""引起来
多对 key:value之间使用 , 分隔
示例:var obj = '{"name":"wangwc","age":30}';
2.使用JSON表示多个对象
使用 [] 来表示一组对象
示例:使用JSON表示2个人的信息
var users = '[{"name":"wangwc","age":30},{"name":"weimz","age":40}]';
四前端中处理JSON
将得到的JSON串转换成JS对象/数组
var js对象 = JSON.parse(JSON串);
#在前端中处理JSON格式字符串 url(r'^json/$', views.json_views), # ----------------- def json_views(request): return render(request, 'json.html')
//file:json.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-1.11.3.js"></script> <script> $(function(){ $("#btnJSON").click(function(){ //1.模拟一个JSON字符串 var flight = '{"flightNO":"NH980","from":"PEK","to":"KIX","time":"14:20"}'; //2.通过JSON.parse()将JSON串转换成JS对象 var obj = JSON.parse(flight); //console.log(obj); //3.解析对象 console.log("航班号:"+obj.flightNO); console.log("出发:"+obj.from); console.log("到达:"+obj.to); console.log("时间:"+obj.time); }); $("#btnJSONArr").click(function(){ var str = '[{"flightNO":"NH980","from":"PEK","to":"KIX","time":"14:20"},{"flightNO":"NH979","from":"KIX","to":"PEK","time":"09:20"}]'; var arr = JSON.parse(str); $(arr).each(function(i,obj){ console.log("下标为"+i+"的元素"); console.log("航班号:"+obj.flightNO); console.log("出发:"+obj.from); console.log("到达:"+obj.to); console.log("时间:"+obj.time); }); }); }); </script> </head> <body> <button id="btnJSON">JSON串->JS对象</button> <button id="btnJSONArr">JSON串->JS数组</button> </body> </html>
#-------显示结果--------- #JSON串->JS对象 显示结果 航班号:NH980 出发:PEK 到达:KIX 时间:14:20 #JSON串->JS数组 显示结果 下标为0的元素 航班号:NH980 出发:PEK 到达:KIX 时间:14:20 下标为1的元素 航班号:NH979 出发:KIX 到达:PEK 时间:09:20
五服务器端的JSON处理
1.在Python中的处理
1.允许将 元组,列表,字典 转换成JSON串
2.元组,字典,列表中的内容必须是
字符串,数字
元组,列表,字典
python中提供了json模块,json模块中提供dumps方法实现json串的转换
# 在服务器端处理JSON格式字符串 url(r'^server-json/$', views.server_json), #------------------------ import json # ====服务器端中处理JSON==== def server_json(requset): # 1.使用字典表示JSON数据 dic = { 'course': 'Ajax', 'duration': 3, 'place': 'BJ', } # 将dic通过json.dumps转换成JSON格式的字符串 jsonStr = json.dumps(dic) # return HttpResponse(jsonStr) # 2. 使用列表表示多个JSON数据(列表中封装字典) list = [ { 'course': 'Ajax', 'duration': 3, 'place': 'BJ', }, { 'course': 'WEB', 'duration': 3, 'place': 'SH', }, { 'course': 'Python', 'duration': 3, 'place': 'CD', } ] jsonList = json.dumps(list) return HttpResponse(jsonStr + jsonList)
#--------------显示结果------------------ {"course": "Ajax", "duration": 3, "place": "BJ"} [{"course": "Ajax", "duration": 3, "place": "BJ"}, {"course": "WEB", "duration": 3, "place": "SH"}, {"course": "Python", "duration": 3, "place": "CD"}]
2.在Django中的处理
使用Django中提供的序列化模块来完成QuerySet到JSON串的转换
from django.core import serializers
jsonStr = serializers.serialize('json',QuerySet)
练习1:在服务器端中,读取Users表中的数据再转换成JSON串
#在服务器端中,读取数据库Users表中的数据,再转换成JSON串 url(r'^json-users/$', views.json_users_view), #-------------------- from django.core import serializers def json_users_view(request): users = Users.objects.all() # jsonUsers = json.dumps(users) # QuerySet不支持json.dumps转换 jsonUser = serializers.serialize('json', users) return HttpResponse(jsonUser)
#-------------显示结果----------- [ {"model": "demo.users", "pk": 1, "fields": {"uname": "123", "upwd": "123", "uemail": "123", "nickname": "123"}}, {"model": "demo.users", "pk": 26, "fields": {"uname": "11", "upwd": "11", "uemail": "11", "nickname": "11"}}, {"model": "demo.users", "pk": 27, "fields": {"uname": "11", "upwd": "1", "uemail": "1", "nickname": "1"}}, {"model": "demo.users", "pk": 28, "fields": {"uname": "11", "upwd": "1", "uemail": "1", "nickname": "1"}}, {"model": "demo.users", "pk": 29, "fields": {"uname": "1", "upwd": "1", "uemail": "1", "nickname": "1"}} ]
练习2:读取Users信息并显示在网页上(使用JSON)
# 读取Users信息并显示在网页上(使用JSON) url(r'^json-users/$', views.json_users_view), url(r'^server-json-users/$', views.server_json_users_view), #------------------------- from django.core import serializers def json_users_view(reuqest): return render(reuqest, 'json-users.html') def server_json_users_view(request): users = Users.objects.all() jsonusers = serializers.serialize('json', users) return HttpResponse(jsonusers)
//file:json-users.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/common.js"></script> <script src="/static/jquery-1.11.3.js"></script> <script> $(function(){ $("#btnShow").click(function(){ var xhr = createXhr(); xhr.open("get","/demo/server-json-users",true); xhr.onreadystatechange = function(){ if(xhr.readyState==4 && xhr.status==200){ //接收响应数据并转换成JS数组 var arr = JSON.parse(xhr.responseText); var html = ""; $(arr).each(function(i,obj){ html+="<tr>"; html+="<td>"+obj.pk+"</td>"; html+="<td>"+obj.fields.uname+"</td>"; html+="<td>"+obj.fields.upwd+"</td>"; html+="<td>"+obj.fields.uemail+"</td>"; html+="<td>"+obj.fields.nickname+"</td>"; html+="</tr>"; }); $("#content").html(html); } } xhr.send(null); }); }); </script> </head> <body> <button id="btnShow">显示</button> <table width="500" border="1"> <thead> <tr> <th>ID</th> <th>用户名</th> <th>密码</th> <th>邮箱</th> <th>昵称</th> </tr> </thead> <tbody id="content"></tbody> </table> </body> </html>
六前端中将JS对象转换成JSON串
方法:JSON.stringify(jsObj)
作用:将jsObj转换成JSON串
七服务器端中将JSON串转换为字典/列表
方法:json.loads(jsonStr)
#1.前端中将JS对象转换成JSON串 url(r'^front-json/$', views.front_view), #---------------------------- def front_view(request): return render(request, 'front-json.html') #-----------显示结果----------- 转换后的值为:{"uname":"wang","uage":30,"ugender":"unknown"} #================================================ #2.服务器端中将JSON串转换为字典/列表 url(r'^server-json/$', views.server_json_view), #------------------ def server_json_view(request): jsonStr = '{"uname":"wang","uage":30,"ugender":"男"}' # 通过json.loads() 将jsonStr转换成python字典 dic = json.loads(jsonStr) s = "姓名:%s,年龄:%s,性别:%s" % (dic['uname'], dic['uage'], dic['ugender']) return HttpResponse(s) #-----------显示结果---------------- 姓名:wang,年龄:30,性别:男
//file:front-json.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-1.11.3.js"></script> <script> $(function(){ $("#btnJSON").click(function(){ var obj = { uname:'wang', uage:30, ugender:'unknown' } //通过JSON.stringify()将obj转换成JSON串 var str = JSON.stringify(obj); console.log("转换后的值为:"+str); }); }) </script> </head> <body> <button id="btnJSON">JS对象->JSON串</button> </body> </html>
练习:通过JSON完成注册操作
# 通过JSON完成注册操作 url(r'^register-json/$', views.register_json_view), url(r'^server-register-json/$', views.server_register_json_view), # ====12.通过JSON完成注册操作==== def register_json_view(request): return render(request, 'register-json.html') def server_register_json_view(request): jsonuser = request.GET['params'] # 将jsonuser转换成Python字典 user = json.loads(jsonuser) print('1111') try: Users.objects.create(uname=user['uname'], upwd=user['upwd'], uemail=user['uemail'], nickname=user['nickname']) return HttpResponse('注册成功') except Exception as e: print(e) return HttpResponse('注册失败')
//file:register-json.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/common.js"></script> <script src="/static/jquery-1.11.3.js"></script> <script> $(function(){ $("#btnReg").click(function(){ var xhr = createXhr(); var params = { uname:$("#uname").val(), upwd:$("#upwd").val(), uemail:$("#uemail").val(), nickname:$("#nickname").val() } //将params转换为JSON串 var str = JSON.stringify(params); xhr.open("get","/demo/server-register-json?params="+str,true); xhr.onreadystatechange = function(){ if(xhr.readyState==4 && xhr.status==200){ alert(xhr.responseText); } } xhr.send(null); }); }) </script> </head> <body> <p> 用户名称:<input type="text" id="uname"> </p> <p> 用户密码:<input type="password" id="upwd"> </p> <p> 电子邮箱:<input type="email" id="uemail"> </p> <p> 用户昵称: <input type="text" id="nickname"> </p> <p> <input type="button" value="注册" id="btnReg"> </p> </body> </html>
八JQ对AJAX的支持
1.$obj.load()
语法:$obj.load(url,data,callback)
url:请求地址
data:请求参数
callback:响应成功后的回调
作用:加载远程地址的内容到$obj中
用法:
1.data:请求参数[可选],如果没有参数则使用get方式
1.通过字符串传参
"key1=value1&key2=value2"
注:此种传参会使用get方式发送请求
2.通过JS对象传参
{
key1:"value1",
key2:"value2"
}
注:此种传参会使用post方式发送请求
2.callback:响应成功后的回调函数[可选]
function(resText){
resText:表示响应回来的数据
}
演示jquery中的$obj.load() 的作用
#演示jquery中的$obj.load() 的作用 url(r'^head/$',views.head_view), url(r'^index/$',views.index_view), #---------------------- def head_view(request): return render(request, 'hand.html') # 将index页面的内容加载到head页面中 def index_view(request): return render(request, 'index.html')
//file:head.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #nav li{ float:left; width:100px; height:30px; line-height:30px; background:red; text-align:center; color:#fff; font-weight:bold; font-size:16px; } #nav{ list-style:none; } </style> </head> <body> <h1>北京欢迎您... ...</h1> <ul id="nav"> <li>首页</li> <li>名胜古迹</li> <li>美食</li> <li>民俗风情</li> </ul> </body> </html>>
//file:index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-1.11.3.js"></script> <script> $(function(){ //加载 /demo/head 页面到#top中 $("#top").load("/demo/head",function(resText){ console.log(resText); window.setTimeout(function(){ $("#top").hide(5000); },5000); }); }) </script> </head> <body> <div id="top"></div> <h1>网页主体内容</h1> <h1>网页底部内容</h1> </body> </html>
2.$.get()
作用:通过get方式异步的向远程地址发送请求
语法:$.get(url,data,callback,type)
1.url:请求地址
2.data:请求参数[可选]
1.使用字符串
2.使用JS对象
3.callback:响应成功后的回调函数[可选]
function(resText){
}
4.type:响应回来的数据的格式[可选]
取值如下:
1.html:响应回来的文本当成html文本处理
2.text:响应回来的文本当成普通文本处理
3.script:响应回来的文本当JS脚本执行
4.json:响应回来的文本是JSON格式,会直接转换成JS对象/数组
1.演示jquery中的$.get()的作用
# 演示jquery中的$.get()的作用 url(r'^jq-get/$',views.jq_get_view), url(r'^server-json-users/$', views.server_json_users_view), # ------------------------- def jq_get_view(request): return render(request, 'jq-get.html') def server_json_users_view(request): users = Users.objects.all() jsonusers = serializers.serialize('json', users) return HttpResponse(jsonusers) #-------显示结果----------- 姓名:123 昵称:123 ========================== 姓名:11 昵称:11 ==========================
file:jq-get.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-1.11.3.js"></script> <script> $(function(){ $("#btnShow").click(function(){ $.get("/demo/server-json-users",function(resText){ //业务处理,由于type的类型是json所以resText直接当成JS对象去处理 $(resText).each(function(i,obj){ console.log("姓名:"+obj.fields.uname); console.log("昵称:"+obj.fields.nickname); console.log("=========================="); }); },'json'); }); }) </script> </head> <body> <button id="btnShow">显示Users</button> </body> </html>
2.通过$.get()完成搜索建议
# 通过$.get()完成搜索建议 url(r'^search/$', views.search_view), url(r'^server-search/$', views.server_search_view), # ------------------------- def search_view(request): return render(request, 'search.html') def server_search_view(request): # 1.接收前端传递过来的参数 -kw kw = request.GET['kw'] # 2.查询User数据库中uname列中kw的信息 users = Users.objects.filter(uname__contains=kw) # 3.将uname封装成列表在转换成JSON串相应 uList = [] if users: for u in users: uList.append(u.uname) return HttpResponse(json.dumps(uList))
//file:search.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #main{ position:relative; } #show{ width:300px; min-height:150px; border:1px solid #000; background:#fff; position:absolute; left:72px; top:30px; display:none; } </style> <script src="/static/jquery-1.11.3.js"></script> <script> $(function(){ $("#uname").keyup(function(){ //判断文本框的值去掉空格后是否为空,不为空发送ajax请求 if(this.value.trim().length == 0){ $("#show").html("");//清空#show里的内容 $("#show").css("display","none");//隐藏#show }else{ $.get("/demo/server-search","kw="+this.value,function(resText){ if(resText.length == 0){ $("#show").html("");//清空#show里的内容 $("#show").css("display","none");//隐藏#show }else{ //清空原有的内容 $("#show").html(""); $(resText).each(function(i,obj){ $("#show").css("display","block");//显示 var $p = $("<p>"+obj+"</p>"); $("#show").append($p); }); } },'json'); } }); }) </script> </head> <body> <div id="main"> 用户名称: <input type="text" id="uname"> <button>搜索</button> <!-- 提示框:绝对定位的,相对于main实现位置的摆放 --> <div id="show"></div> </div> </body> </html>
3.$.post()
语法:$.post(url,data,callback,type)
4.$.ajax()
作用:自定义所有的ajax参数
语法: $.ajax({AJAX的参数对象})
AJAX的参数对象:
1. url : 请求的地址
2. data : 请求到服务器端的参数
1.字符串 : "key1=value1&key2=value2"
2.JS对象: {key1:"value1",key2:"value2"}
3.type : 请求方式 'get' 或 'post'
4.dataType : 响应回来的数据的格式
json,html,text,script
5.async : 是否采用异步的方式发送请求
true:异步(默认值)
false:同步
6.success:响应成功后的回调函数
function(resText){
resText表示的是响应回来的数据
}
7.error:请求或响应失败时的回调函数
function(){
}
通过$.ajax() 完成自定义的ajax请求
#通过$.ajax() 完成自定义的ajax请求 url(r'^jq-ajax/$',views.jq_ajax_view), url(r'^server-json-users/$', views.server_jsonusers), #-------------------------- def jq_ajax_view(request): return render(request,'jq-ajax.html') def server_json_users(request): users = Users.objects.all() jsonusers = serializers.serialize('json', users) return HttpResponse(jsonusers) #------------显示结果---------------- 用户名:123 邮箱:123 用户名:11 邮箱:11 用户名:11
//file:jq-ajax.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-1.11.3.js"></script> <script> $(function(){ $("#btnAjax").click(function(){ $.ajax({ url:"/demo/server-json-users", type:"get", dataType:"json", async:true, success:function(resText){ $(resText).each(function(i,obj){ console.log("用户名:"+obj.fields.uname); console.log("邮箱:"+obj.fields.uemail); }); } }); }); }); </script> </head> <body> <button id="btnAjax">使用$.ajax()请求数据</button> </body> </html>