GVKun编程网logo

AJAX—JSON和Django内置序列化(django ajax json)

18

关于AJAX—JSON和Django内置序列化和djangoajaxjson的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于不可JSON序列化、ajax–IE想从Django下载返回的JS

关于AJAX—JSON和Django内置序列化django ajax json的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于不可JSON序列化、ajax – IE想从Django下载返回的JSON、ajax—Json、Ajax——json等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

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)

  

 
 
 

<Django对象>不可JSON序列化

不可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

ajax – IE想从Django下载返回的JSON

我有一个Django站点,其中一个页面正在进行基于 AJAX的文件上传(使用 Valum’s file uploader),它通过JSON返回一些信息. Django返回JSON的方式是……

return HttpResponse( json.dumps( info ),mimetype="application/json" )

在Firefox,Chrome和Safari中尝试页面时,我会获得文件上传器的相应行为,标记上传完成并将数据插入页面上的表格中.

在IE8中进行测试后,我在Django发回JSON后得到了错误的行为:出现了一个下载对话框 – 如果保存它就是JSON文本 – 并且文件上传者继续认为文件正在上传,因为它没有收到任何响应从服务器. IE必须看到响应并将其解释为下载而不是将其传递给页面的javscript.请注意,我已经尝试将mime更改为application / javascript,这似乎没有任何区别.有人得到了修复?

解决方法

IE存在来自iframe的“application / json”响应问题.

虽然我不知道Django的细节,但我可以从其他框架的经验中说,解决这个问题的最简单方法之一是将响应作为“text / html”返回,然后将该字符串解析为JSON.在这种情况下,我猜它就像将响应更改为:

return HttpResponse( json.dumps( info ),mimetype="text/html" )

然后解析你喜欢的任何框架的响应(无论是原生的JSON.parse还是jQuery.parse等).

应仅针对您是ajax上传文件的情况进行本地化(就像您在这里一样).

ajax—Json

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

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的分享已经结束,谢谢您的关注,如果想了解更多关于不可JSON序列化、ajax – IE想从Django下载返回的JSON、ajax—Json、Ajax——json的相关知识,请在本站进行查询。

本文标签: