关于AJAX—JSON和Django内置序列化和djangoajaxjson的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于不可JSON序列化、ajax–IE想从Django下载返回的JS
关于AJAX—JSON和Django内置序列化和django ajax json的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于
AJAX—JSON和Django内置序列化(django ajax json)
JSON
什么是JSON
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言 *
- JSON 具有自我描述性,更易理解
* JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
JSON与XML的对比
JSON 格式于2001年由 Douglas Crockford 提出,目的就是取代繁琐笨重的 XML 格式。
JSON 格式有两个显著的优点:书写简单,一目了然;符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON迅速被接受,已经成为各大网站交换数据的标准格式,并被写入ECMAScript 5,成为标准的一部分。
XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。
用XML表示中国部分省市数据如下:
<?xml version="1.0" encoding="utf-8"?>
<country>
<name>中国</name>
<province>
<name>黑龙江</name>
<cities>
<city>哈尔滨</city>
<city>大庆</city>
</cities>
</province>
<province>
<name>广东</name>
<cities>
<city>广州</city>
<city>深圳</city>
<city>珠海</city>
</cities>
</province>
<province>
<name>台湾</name>
<cities>
<city>台北</city>
<city>高雄</city>
</cities>
</province>
<province>
<name>新疆</name>
<cities>
<city>乌鲁木齐</city>
</cities>
</province>
</country>
用JSON表示如下:
{
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}
}, {
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}
}, {
"name": "台湾",
"cities": {
"city": ["台北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["乌鲁木齐"]
}
}]
}
由上面的两端代码可以看出,JSON 简单的语法格式和清晰的层次结构明显要比 XML 容易阅读,并且在数据交换方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用得带宽。
JSON的格式
类似于python中的字典格式,但是key和value都要加引号,而且是双引号!
合格的json对象:
["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["张三", "李四"] }
[ { "name": "张三"}, {"name": "李四"} ]
不合格的json对象:
{ name: "张三", ''age'': 32 } // 属性名必须使用双引号
[32, 64, 128, 0xFFF] // 不能使用十六进制值
{ "name": "张三", "age": undefined } // 不能使用undefined
{ "name": "张三",
"birthday": new Date(''Fri, 26 Aug 2011 07:13:10 GMT''),
"getName": function() {return this.name;} // 不能使用函数和日期对象
}
stringify与parse方法
JavaScript中关于JSON对象和字符串转换的两个方法:
JSON.parse(): 用于将一个 JSON 字符串转换为 JavaScript 对象
JSON.parse(''{"name":"fuyong"}'');
JSON.parse(''{name:"fuyong"}'') ; // 错误
JSON.parse(''[18,undefined]'') ; // 错误
JSON.stringify(): 用于将 JavaScript 值转换为 JSON 字符串。
JSON.stringify({"name":"fuyong"})
Django内置序列化
我们的数据中经常有日期时间,也就是datetime对象,而json.dumps是无法处理这样在类型的,那就需要通过自定义处理器来做扩展,用法如下:
1、定义一个类,接收参数后返回一个指定格式的HTTPResponse对象:
class JsonCustomEncoder(json.JSONEncoder):
"""
自定义一个支持序列化时间格式的类
"""
def default(self, o):
if isinstance(o, datetime):
return o.strftime("%Y-%m-%d %H:%M:%S")
elif isinstance(o, date):
return o.strftime("%Y-%m-%d")
else:
return json.JSONEncoder.default(self, o)
2、在views系统函数中用json.dunps方法,指定cls属性为自定义的类名
def books_json(request):
book_list = models.Book.objects.all().values_list("title", "publish_date")
ret = json.dumps(list(book_list), cls=JsonCustomEncoder)
return HttpResponse(ret)
不可JSON序列化
如何解决<Django对象>不可JSON序列化?
simplejson
并且json
不能很好地与Django对象配合使用。
Django的内置序列化器只能序列化由django对象填充的查询集:
data = serializers.serialize(''json'', self.get_queryset())
return HttpResponse(data, content_type="application/json")
在你的情况下,self.get_queryset()
其中包含django对象和dict的混合。
一种选择是摆脱中的模型实例,self.get_queryset()
并使用dict将其替换为model_to_dict
:
from django.forms.models import model_to_dict
data = self.get_queryset()
for item in data:
item[''product''] = model_to_dict(item[''product''])
return HttpResponse(json.simplejson.dumps(data), mimetype="application/json")
希望能有所帮助。
解决方法
我有以下用于序列化查询集的代码;
def render_to_response(self,context,**response_kwargs):
return HttpResponse(json.simplejson.dumps(list(self.get_queryset())),mimetype="application/json")
以下是我的 get_querset()
[{''product'': <Product: hederello ()>,u''_id'': u''9802'',u''_source'': {u''code'': u''23981'',u''facilities'': [{u''facility'': {u''name'': {u''fr'': u''G\xe9n\xe9ral'',u''en'': u''General''},u''value'': {u''fr'': [u''bar'',u''r\xe9ception ouverte 24h/24'',u''chambres non-fumeurs'',u''chambres familiales'',.........]}]
我需要序列化。但是它说不能序列化<Product: hederello ()>
。因为列表由Django对象和字典组成。有任何想法吗 ?
ajax – IE想从Django下载返回的JSON
return HttpResponse( json.dumps( info ),mimetype="application/json" )
在Firefox,Chrome和Safari中尝试页面时,我会获得文件上传器的相应行为,标记上传完成并将数据插入页面上的表格中.
在IE8中进行测试后,我在Django发回JSON后得到了错误的行为:出现了一个下载对话框 – 如果保存它就是JSON文本 – 并且文件上传者继续认为文件正在上传,因为它没有收到任何响应从服务器. IE必须看到响应并将其解释为下载而不是将其传递给页面的javscript.请注意,我已经尝试将mime更改为application / javascript,这似乎没有任何区别.有人得到了修复?
解决方法
虽然我不知道Django的细节,但我可以从其他框架的经验中说,解决这个问题的最简单方法之一是将响应作为“text / html”返回,然后将该字符串解析为JSON.在这种情况下,我猜它就像将响应更改为:
return HttpResponse( json.dumps( info ),mimetype="text/html" )
然后解析你喜欢的任何框架的响应(无论是原生的JSON.parse还是jQuery.parse等).
应仅针对您是ajax上传文件的情况进行本地化(就像您在这里一样).
ajax—Json
上一个视频播放例子是通过ajax实现的,异步刷新的好处我们已经体会到了,此外ajax传递复杂数据如果自己进行格式定义的话会经历组装、解析的过程,因为ajax中有一个事实上的数据传输标准Json。那我们来介绍一下吧。
1.基础
Ø 定义
JSON(JavaScriptObject Notation) 是一种轻量级的数据交换格式。它基于JavaScript(StandardECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java,JavaScript,Perl,Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)。
Ø 特点
Json(是一个标准,就像XML一样,规定了对象以什么样的格式保存为一个字符串)将复杂对象序列化为一个字符串,在浏览器端再将字符串反序列化为javascript可读取的对象。其几乎为所有的语言所支持。
Ø 来源
特点提到是像XML文件一样的,在ajax中,我们提高创建对象XMLHTTPRequset,看到前面是XML,最初的时候是为了解析和传递XML文件,可是我们通常发的是一些普通的文本或者字符串,当然xml格式存在一些缺点:Xml的缺点是太占空间,因为XML下面都是一个接着一个节点,这样必然占用很大的空间。为了降低数据流量,发明了json;类似于xml。传递数据,占的体积更少而已。
Xml包含的东西很复杂,并且占的空间大,如图:
Ø 用法
C#中将.NET对象序列化为一个Json字符串的方法:JavascriptSerializer().Serializer(p),JavascriptSerializer在System.Web.Extensions.dll中,是.Net3.x中新增加的类,如果在.NET2.0中则需要用第三方控件。
Ø JS解析Json
有的资料介绍了eval解析Json,这样存在不安全性,jquery等库提供了解析json的方法,有的浏览器支持json.parse;不支持的引用json2.js也是可以的。注意js对数组的变量也要for(vari=0;i<persons.length;i++)
2.应用
Ø 举例
第一步:新建一个person类
<span><strong>using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace json { public class person { public string Name { get; set; } public string Age { get; set; } public string Email{ get; set; } } }</strong></span>
新建处理程序为json.ashx(获得一个对象的json格式,即将对象序列化)
<span><strong>using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Script.Serialization; namespace json { /// <summary> /// json 的摘要说明 /// </summary> public class json : IHttpHandler { public void ProcessRequest(HttpContext context) { //context.Response.ContentType = "text/plain"; context.Response.ContentType = "text/html"; List<person> list = new List<person>(); list.Add(new person { Name = "lxn",Age = "25",Email = "1234567@qq.com" }); list.Add(new person { Name = "wzp",Email = "1234567@163.com" }); list.Add(new person{ Name = "lxl",Age = "24",Email = "1234567@126.com" }); JavaScriptSerializer jss = new JavaScriptSerializer(); //定义一个序列化的串 //获取的是一个数组,将其序列化 //string json= jss.Serialize(list); //将list序列化 //获取的是一个对象,将一个对象序列化 string json = jss.Serialize(new person { Name = "lxl",Email = "1234567@126.com" }); context.Response.Write(json); } public bool IsReusable { get { return false; } } } }</strong></span>
新建html页为jsonHtml(Jsonhtml,将序列化的字符串转化为javascript对象)
<span><strong><!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <Meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Json例子</title> <script src="ajax.js" type="text/javascript"></script> <script type="text/javascript"> function go() { ajax("json.ashx",function (resTxt) { var p = JSON.parse(resTxt); //p为一个对象 alert("姓名:" + p.Name + ";年龄:" + p.Age) //alert(resTxt); //对数组式的进行遍历 //var persons = JSON.parse(resTxt); //for (var i = 0; i < persons.length; i++) { // var p = persons[i]; // alert("姓名:" + p.Name + ";年龄:" + p.Age) //} }); } </script> </head> <body onload="go()"> </body> </html> </strong></span>ajax交互页面:
<span><strong>function ajax(url,onsuccess) { var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); //创建XMLHTTP对象,考虑兼容性。XHR xmlhttp.open("POST",url,true); //“准备”向服务器的GetDate1.ashx发出Post请求(GET可能会有缓存问题)。这里还没有发出请求 //DRY:不要复制粘贴代码 //AJAX是异步的,并不是等到服务器端返回才继续执行 xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) //readyState == 4 表示服务器返回完成数据了。之前可能会经历2(请求已发送,正在处理中)、3(响应中已有部分数据可用了,但是服务器还没有完成响应的生成) { if (xmlhttp.status == 200) //如果Http状态码为200则是成功 { onsuccess(xmlhttp.responseText); } else { alert("AJAX服务器返回错误!"); } } } //不要以为if (xmlhttp.readyState == 4) {在send之前执行!!!! xmlhttp.send(); //这时才开始发送请求。并不等于服务器端返回。请求发出去了,我不等!去监听onreadystatechange吧! }</strong></span>
注解:在服务器端通过上面的把一个对象转换为json字符串,在客户端通过json.parse将其转为对象,是一个对应的关系。Json.js应对不支持的parse的,实现兼容。产生的效果自己动手试试吧。
同样我们也可以对数组形式进行转化,在html页用for对其进行遍历即可。
其他同对象转换,只是需要修改部分代码即可,如下:
html页面:
<span><strong> function go() { ajax("json.ashx",function (resTxt) { //var p = JSON.parse(resTxt); //p为一个对象 // alert("姓名:" + p.Name + ";年龄:" + p.Age) // ) //alert(resTxt); //对数组式的进行遍历 var persons = JSON.parse(resTxt); for (var i = 0; i < persons.length; i++) { var p = persons[i]; alert("姓名:" + p.Name + ";年龄:" + p.Age) } }); }</strong></span>
一般处理程序面:
<span><strong> public void ProcessRequest(HttpContext context) { //context.Response.ContentType = "text/plain"; context.Response.ContentType = "text/html"; List<person> list = new List<person>(); list.Add(new person { Name = "lxn",Email = "1234567@126.com" }); JavaScriptSerializer jss = new JavaScriptSerializer(); //定义一个序列化的串 //获取的是一个数组,将其序列化 string json= jss.Serialize(list); //将list序列化 //获取的是一个对象,将一个对象序列化 //string json = jss.Serialize(new person { Name = "lxl",Email = "1234567@126.com" }); context.Response.Write(json); }</strong></span>
3.总结
json和xml一样都是一种数据交换格式:
1、方便于传输,较少冗余的字符。当然直接传二进制是最好的,但面临难解析的问题。亦可以是xml、纯字符串的方式,但json有其独到的好处。
2、方便转换。有很多的json api提供了json字符串转成对象、对象转换成json串的方法。
3、易于阅读。json代码的良好结构,可以很直观地了解存的是什么内容。
这是目前初步的理解,不足之处请多指教~
Ajax——json
json是js提供的一种数据交换格式!
json的语法
* {}:是对象!
> 属性名必须使用双引号括起来!单引不行!!!
> 属性值:
* null
* 数值
* 字符串
* 数组:使用[]括起来
* boolean值:true和false
应用json
var person = {"name":"zhangSan","age":18,"sex":"male"};
json与xml比较
* 可读性:XML胜出
* 解析难度:JSON本身就是JS对象(主场作战),所以简单很多
* 流行度:XML已经流行好多年,但在AJAX领域,JSON更受欢迎。
package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.servletexception; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.Test; public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException { response.setContentType("text/html;charset=utf-8"); String str="{\"name\":\"Zhangsan\",\"age\":16,\"sex\":\"male\"}"; response.getWriter().print(str); System.out.println(str); } }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getcontextpath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'json1.jsp' starting page</title> <Meta http-equiv="pragma" content="no-cache"> <Meta http-equiv="cache-control" content="no-cache"> <Meta http-equiv="expires" content="0"> <Meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <Meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script type="text/javascript"> function createXMLHttpRequest(){ try { return new XMLHttpRequest(); } catch (e) { try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { return new ActiveXObject("MicroSoft.XMLHTTP"); } catch (e) { // Todo: handle exception } } } } window.onload=function(){ var bt=document.getElementById("bt"); bt.onclick=function(){ var xmlHttp=createXMLHttpRequest(); xmlHttp.open("GET","<c:url value='/AServlet' />",true); xmlHttp.send(null); xmlHttp.onreadystatechange=function(){ if(xmlHttp.readyState==4 && xmlHttp.status==200){ var text=xmlHttp.responseText; var person=eval("("+text+")"); var s=person.name+","+person.age+","+person.sex; document.getElementById("h1").innerHTML=s; } }; }; }; </script> </head> <body> <h1>json演示</h1> <button id="bt">点击这里</button> <h1 id="h1"></h1> </body> </html>json-lib可以把javabean转换成json串
核心类
* JSONObject --> Map
> toString();
> JSONObject map = JSONObject.fromObject(person):把对象转换成JSONObject对象
* JSONArray --> List
> toString()
> JSONArray jsonArray = JSONObject.fromObject(list):把list转换成JSONArray对象
package demo; import java.util.ArrayList; import java.util.List; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.junit.Test; public class Demo { @Test public void fun1(){ JSONObject map=new JSONObject(); map.put("name","ZHangsan"); map.put("age",16); map.put("sex","male"); String s = map.toString(); System.out.println(s); } @Test public void fun2() { Person p=new Person("Lisi",18,"male"); //把对象转换成JSONObject对象 JSONObject map=JSONObject.fromObject(p); String s = map.toString(); System.out.println(s); } @Test public void fun3() { Person p1=new Person("Lisi",55,"male"); Person p2=new Person("haha",33,"male"); JSONArray list=new JSONArray(); list.add(p1); list.add(p2); String s = list.toString(); System.out.println(s); } @Test public void fun4() { Person p1=new Person("Lisi","male"); List<Person> list=new ArrayList<Person>(); list.add(p1); list.add(p2); System.out.println(JSONArray.fromObject(list)); } }
今天的关于AJAX—JSON和Django内置序列化和django ajax json的分享已经结束,谢谢您的关注,如果想了解更多关于
本文标签: