zoukankan      html  css  js  c++  java
  • Ajax基础与Json应用(一)

    一.Ajax概念

    Ajax是异步的javacript和xml

    发音:
    Ajax [ˈeɪˌdʒæks]

    二.同步与异步

    传统方式(同步):一个请求对应一个回应,他们是同步的,回应不完成,没办法对这个页面进行操作。

    具体解释:
    客户端要发一个请求,服务器端要去处理,响应,这时候客户端完全是在等待,等待服务器端的处理和响应。当服务器端的处理和响应完成过后,客户端会重新载入页面,这时候如果有错误,只能再次发起请求,再次等待。
    异步:

    说明:填写复杂的表单,填写到邮箱地址的时候,页面当时就把邮箱的地址发送到服务器,也就是页面发送了一个请求,服务器去做处理和响应,得到你的邮箱和地址填写重复,他会把响应结果发给页面,但是在这个过程中,依然可以填写其他的内容。这时候服务器告诉你已经有重复的邮箱的地址,在页面的表现只是在邮箱地址的旁边标上一行字,把整个文本框标红,并没有重新刷新页面,这样 表单上的错误会实时的标注出来,你也可以实时的更正错误。这个过程你不会有整个页面的刷新,也不会有整个页面的提交和等待。也就是说:当你最后点击一下提交,一切都会搞定,这就是ajax出现后的异步。
    **异步实现步骤:*8
    1.运用HTML和CSS来实现页面,表达信息。
    2.运用XMLHttpRequest和web服务器进行数据的异步交换

    3.运用JavaScript操作DOM,实现动态局部刷新

    三.XMLHttpRequest对象创建

    首先要是实例化一个XMLHttpRequest对象
    var request = new XMLHttpRequest();
    注意:
    所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。
    XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
    Ie5,ie6是不支持标准的XMLHttpRequest的.

     var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    

    四.Http请求

    http是计算机通过网络进行通信的规则
    http是一种无状态协议
    1.一个完整的HTTP请求的过程,通常有7个步骤:
    (1)建立TCP连接
    (2)Web浏览器向Web服务器发送请求命令
    (3)Web浏览器发送请求头信息
    (4)Web服务器应答
    (5)Web服务器发送应答头信息
    (6)Web服务器向浏览器发送数据
    (7)Web服务器关闭TCP连接
    2.一个HTTP请求一般由四部分组成:
    (1)HTTP请求的方法或动作,比如是GET还是POST请求。
    (2)正在请求的URL,总得知道请求的地址是什么吧
    (3)请求头,包含一些客户端环境信息,身份证信息等
    (4)请求体,也就是请求正文,请求正文中可以包含客户提交的查询字符串信息,表单信息等等。
    (一般请求头和请求体之间有个空行,这个空行很重要,表示请求头已经结束了,)
    HTTP请求例子:

    **3.提交数据的方式 **
    GET方法:
    一般用于信息获取
    使用URL传递参数
    对于发送的信息数量也有限制,一般在2000个字符左右
    POST方法:
    一般用于修改服务器上的资源。 对于所发的信息量无限制
    4.一个HTTP响应一般由三部分组成
    (1)一个数字和文字组成的状态码,用来显示请求成功还是失败;
    (2)响应头,响应头也和请求头一样,包含许多包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等。
    (3)响应体,也就是响应正文。
    5.HTTP状态码:
    HTTP状态码由3位数字构成,其中首位数字定义了状态码的类型:
    1XX:信息类,表示收到Web浏览器请求,正在进一步的处理中。
    2XX:成功,表示用户请求被正确接收,理解和处理,例如:200 OK
    3XX:重定向,表示请求没有成功,客户必须采取进一步的动作
    4XX:客户端错误,表示客户端提交的请求有错误,例如:400 NOT FOUND 意味着请求中所引起的文档不存在
    5XX:服务器错误,表示服务器不能完成对请求的处理:如500

    五.xmlhttprequest发送请求

    open(method,url,async) 发送请求方法 地址 请求同步/异步,一般是异步,默认值为true
    send(string)
    在使用 GET 方式请求时无需填写参数
    在使用 POST 方式时参数代表着向服务器发送的数据

    例子

    setRequestHeader 必须要写在 open()和sent()的中间,否则会出错误

    //完整的GET请求
    var oAjax = new XMLHttpRequest();//创建Ajax对象
    oAjax.open("GET","create.php",true);//连接服务器
    oAjax.send();//发送请求
    
    //完整的POST发送请求
    var oAjax = new XMLHttpRequest();//创建
    oAjax.open("POST","create.php",true);//"POST"
    oAjax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");//设置HTTP头信息.必须在open与send之间,否则出现异常.
    oAjax.send("name=陈二狗&sex=男");//发送给服务器的内容
    

    六.xmlhttprequest获取响应

    XMLHttpRequest取得响应:


    1.创建XMLHttpRequest对象;
    2.调用open();
    3.放入一些数据;
    4.对这个过程进行监听,来知道服务器是否做出响应;
    5.做一些事情,比如说获取服务器响应的内容、页面上的一些重现。
    对服务器的相应进行监听:

    request.onreadystatechange = function({……})
    request.onreadystatechange = function() {
        if (request.readyState === 4 && request.status === 200) {
            //处理request.responseText
        }
    }
    

    六. 配置php服务器环境-安装配置xampp

    首先需要下载xampp的安装包。
    http://xampps.com/
    解压安装包,安装地点在D盘,安装完成,启动XAMPP
    在XAMPP控制面板中,我们可以看到Service一列的单选框略有不同,“X”表示相应组件还没有设为Windows系统服务;“空白”表示没有安装该组件;此外还有“√”,表示该组件已经安装成为Windows系统服务,可以start。
    下面我们就单击Apache和MySQL前的“X”,在弹出的对话框中点击“Yes”,将它们设为系统服务。
    第1步:点击XAMPP控制面板上的start按钮,启动Apache服务器。如图所示,启动Apache后会在按钮和下方状态中看到变化

    我们看到面板上输出了xampp的初始化日志。
    提示Apache的80端口被占用了,
    于是win+r 运行cmd,输入netstat -ano

    看来我们需要修改系统设置来更换一个端口号。
    点击右上角的【系统设置】->【Service and Port Settings】,修改对应的端口号,然后点击【Save】保存。

    修改Apache端口后,需要同时修改配置文件。
    点击Apache后的【Config】,选择httpd- conf,打开配置文件。
    搜索Listen,把后边的端口号,调整为我们刚刚修改后的端口号,保存。重启下电脑
    回到控制面板,点击我们要启动的应用后边的【Start】,面板上【Module】列变色,【PID】有值,说明我们的程序启动好了。

    打开浏览器,输入localhost,看到了php相关的信息。
    至此,我们的环境已经搭建好了。


    第2步:Apache默认的应用程序运行的根目录是xampphtdocs,打开htdocs文件夹,我们会发现最后有一个index.php文件,接下来我们就要在浏览器中访问这个文件,验证PHP环境是否已经配置成功。
    第3步:打开浏览器,输入网址:http://localhost:81/index.php,
    出现XAMPP的管理页面,说明PHP可以正常运行,环境搭建成功。接下来就可以编写PHP进行项目开发了。

    问题:我的网络文档应该放在哪里?
    所有网络文档都放在 htdocs 主文件夹中(.xampphtdocs)。
    1)找到配置文件,并在xampp/htdocs下面新建一个文件夹作为你的根目录,譬如:demo。
    2)、在根目录随便创建一个HTML文件,输入文字以备测试,譬如:index.html
    3、打开chrome浏览器,输入:localhost/根目录/HTML文件名,如果可以出现就说明运行本地服务器成功,譬如:
    localhost/demo/index.html

    七.简单的ajax例子

    1.例子概述
    (1)查询员工的基本信息,通过查询员工的编号来查询员工的基本信息
    (2)新建员工信息,包括员工姓名,员工编号,员工性别,员工岗位

    这个例子中;
    Html页面,用来实现员工查询和新建的页面
    Php页面,用来实现查询员工和新建员工的后台接口
    2.设置站点
    上面我们已经配置好了php环境,我们来用dreamwear设置下站点
    php测试页面

    <h1> 这是一个测试页面
    	<?php
            echo "hello word"
        ?>
    </h1>
    

    解释下:
    (1)php是以结尾
    (2)php的默认文件扩展名是.php
    (3)php的语句是以;结尾
    (4)echo() 函数输出一个或多个字符串。
    直接输出字符或字符串的意思:例如:echo "abc"; 就会输出abc echo 'abc' 一样是输出abc . 如果仅仅只输出字符串的话,单引号和双引号是输出内容是一样的,如果要输出字符串变量,例如字符串变(a='abc'; echo ")a123" 则会输出abc123 ,但如果用 echo '(a123' 则只会输出)a123 ,也就是说单引号里面的内容会原样输出,而双引号则会判断里面有没有变量,有变量的话则转化为变量的值。
    结果:

    3.页面设置
    Php页面(用来实现查询员工和新建员工的后台接口):

    <?php
    //设置页面内容是html编码格式是utf-8
    header("Content-Type: text/plain;charset=utf-8"); //响应过来的内容格式是纯文本
    //header("Content-Type: application/json;charset=utf-8"); //响应过来的内容格式是json字符串
    //header("Content-Type: text/xml;charset=utf-8"); 		 
    //header("Content-Type: text/html;charset=utf-8"); 		 
    //header("Content-Type: application/javascript;charset=utf-8"); 
    
    //定义一个多维数组,包含员工的信息,每条员工信息为一个数组,定义姓名编号岗位。
    //它可以包含这样一个键值的方式。因为这只是一个简单的例子,所以就把员工的信息都定义在多维数组中,而不再存储数据库。
    $staff = array
    	(
    		array("name" => "洪七", "number" => "101", "sex" => "男", "job" => "总经理"),
    		array("name" => "郭靖", "number" => "102", "sex" => "男", "job" => "开发工程师"),
    		array("name" => "黄蓉", "number" => "103", "sex" => "女", "job" => "产品经理")
    	);
    
    //判断如果是get请求,则进行搜索;如果是POST请求,则进行新建
    //$_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
    //$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法
    if ($_SERVER["REQUEST_METHOD"] == "GET") {
    	search();
    } elseif ($_SERVER["REQUEST_METHOD"] == "POST"){
    	create();
    }
    
    //通过员工编号搜索员工
    function search(){
    	//检查是否有员工编号的参数
    	//isset检测变量是否设置;empty判断值为否为空
    	//超全局变量 $_GET 和 $_POST 用于收集表单数据
    	if (!isset($_GET["number"]) || empty($_GET["number"])) {
    		echo "参数错误";
    		return;
    	}
    	//函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    	//global 关键词用于访问函数内的全局变量
    	global $staff;
    	//获取number参数
    	$number = $_GET["number"];
    	$result = "没有找到员工。";
    	
    	//遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
    	foreach ($staff as $value) {
    		if ($value["number"] == $number) {
    			$result = "找到员工:员工编号:" . $value["number"] . ",员工姓名:" . $value["name"] . 
    			                  ",员工性别:" . $value["sex"] . ",员工职位:" . $value["job"];
    			break;
    		}
    	}
        echo $result;
    }
    
    //创建员工
    function create(){
    	//判断信息是否填写完全
    	if (!isset($_POST["name"]) || empty($_POST["name"])
    		|| !isset($_POST["number"]) || empty($_POST["number"])
    		|| !isset($_POST["sex"]) || empty($_POST["sex"])
    		|| !isset($_POST["job"]) || empty($_POST["job"])) {
    		echo "参数错误,员工信息填写不全";
    		return;
    	}
    	//TODO: 获取POST表单数据并保存到数据库
    	
    	//提示保存成功
    	echo "员工:" . $_POST["name"] . " 信息保存成功!";
    }
    
    ?>
    

    相关知识点:
    1)
    PHP文件插入header("Content-type: text/html; charset=utf-8");
    相当于页面里面的<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    2)

    //定义一个多维数组,包含员工的信息,每条员工信息为一个数组,定义姓名编号岗位。
    //它可以包含这样一个键值的方式。因为这只是一个简单的例子,所以就把员工的信息都定义在多维数组中,而不再存储数据库。
    $staff = array
    	(
    		array("name" => "洪七", "number" => "101", "sex" => "男", "job" => "总经理"),
    	);
    

    3)请求的判断
    $_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
    在函数中使用$staff这样一个全局变量。我们需要这样global $staff;来定义一下,否则直接使用$staff会报错
    但是这种超全局变量就不会出现这种情况,我们在哪里都可以使用,
    $_SERVER["REQUEST_METHOD"]这个变量表示的是表单提交数据的方式,get或者post
    4)通过员工编号搜索员工思路

    if (!isset($_GET["number"]) empty($_GET["number"])) {
        echo "参数错误";
        return;
    }
    

    (1)首先我们检查一下参数里边有没有员工的编号,如果没有员工的编号,我们是没法搜索员工的
    (2)先检查一下我们的GET的url参数中有没有number这么一个字段,isset是检查变量是否设置,也就是这个number变量有没有,empty代表这个变量是否为空,在这里,如果这个变量没有或者为空,我们都显示参数错误:echo "参数错误";也就是说页面直接返回“参数错误”,在浏览器中预览一下,我们没有任何参数的情况下,代表的是一个get请求,当我们没有加number参数的时候。它会直接返回参数错误,当然如果有参数错误,就直接查询了。查询,就把这个number参数获取到。
    (3)查询结果,先是没有找到,然后遍历$staff多维数组,如果数组中某条记录的number等于我们传进来的员工编号,就把这个结果改成找到员工,并显示员工信息,然后终止循环,把结果打印出来。

    //函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    //global 关键词用于访问函数内的全局变量,在函数中使用$staff这样一个全局变量。//我们需要这样global $staff;来定义一下,否则直接使用$staff会报错
    	global $staff;
    	//获取number参数
    	$number = $_GET["number"];
    	$result = "没有找到员工。";
    	
    	//遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改//返回结果
    	foreach ($staff as $value) {
    		if ($value["number"] == $number) {
    			$result = "找到员工:员工编号:" . $value["number"] . ",员工姓名:" . $value["name"] . 
    			                  ",员工性别:" . $value["sex"] . ",员工职位:" . $value["job"];
    			break;
    		}
    	}
    

    5)新建员工信息思路
    (1)我们先判断下信息是否填写完全,name,number,sex,job等等这些字段是不是都有值。
    (2)一旦某个字段没有值!isset($_POST["name"])或者值为空empty($_POST["name"])
    ,就显示参数错误,员工信息填写不全echo "参数错误,员工信息填写不全";

    //创建员工
    function create(){
    	//判断信息是否填写完全
    	if (!isset($_POST["name"]) || empty($_POST["name"])
    		|| !isset($_POST["number"]) || empty($_POST["number"])
    		|| !isset($_POST["sex"]) || empty($_POST["sex"])
    		|| !isset($_POST["job"]) || empty($_POST["job"])) {
    		echo "参数错误,员工信息填写不全";
    		return;
    	}
    	//TODO: 获取POST表单数据并保存到数据库
    	
    	//提示保存成功
    	echo "员工:" . $_POST["name"] . " 信息保存成功!";
    }
    

    6.服务器端测试
    大家在日常进行web开发的时候,有时候后台做好之后,总是等待依赖前台做好之后,可以去调试,其实完全没有必要
    我们只需要约定好接口, 发送的报文和返回的报文,通过fiddler或者类似的工具,直接就可以进行调试了。不需要依赖前台是否完成

    在没有客户端的情况下对服务端信息进行测试
    1)

    Excute执行之后,左边会有一条信息


    双击这条信息,右侧的textview下方会有服务器返回的相应信息

    2)http://localhost/ajaxdemo/server.php?number=101
    得到结果

    3).post请求
    (1)因为是post请求,所以服务器地址不需要加上参数
    (2)需要加上Content-Type:"application/x-www-form-urlencoded"
    (3)需要在Request Body里填写息相关信息

    得到结果

    7.客户端测试
    html页面:

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Demo</title>
    <style>
    body, input, select, button, h1 {
    	font-size: 28px;
    	line-height:1.7;
    }
    </style>	
    </head>
    
    <body>
    
    <h1>员工查询</h1>
    
    <label>请输入员工编号:</label>
    <input type="text" id="keyword" />
    <button id="search">查询</button>
    <p id="searchResult"></p>
    
    <h1>员工新建</h1>
    <label>请输入员工姓名:</label>
    <input type="text" id="staffName" /><br>
    <label>请输入员工编号:</label>
    <input type="text" id="staffNumber" /><br>
    <label>请选择员工性别:</label>
    <select id="staffSex">
    <option>女</option>
    <option>男</option>
    </select><br>
    <label>请输入员工职位:</label>
    <input type="text" id="staffJob" /><br>
    <button id="save">保存</button>
    <p id="createResult"></p>
    alert
    <script>
    document.getElementById("search").onclick = function() { 
    	//发送查询请求并调用
    	//new一个XMLHttpRequest()
             var request;
             if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
               request=new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
               reques=new ActiveXObject("Microsoft.XMLHTTP");
             }
    	//请求的地址需要带参数,参数为id为keyword的input的值
            //get方式添加数据
    	request.open("GET", "server.php?number="+encodeURI(document.getElementById('keyword').value)+"&" + new Date().getTime() );
    	request.send();
    	request.onreadystatechange = function() {
    		//获取服务器上的readystate的改变,当他为4的时候说明请求已经结束了,当他为202的时候说明请求成功
    		//先判断他readystate是否为4,当他为202的时候id为searchResult的内容为 request.responseText,否则alert
    		if (request.readyState===4) {
    			if (request.status===200) { 
    				document.getElementById("searchResult").innerHTML = request.responseText;
    			} else {
    				alert("发生错误:" + request.status);
    			}
    		} 
    	}
    }
    
    document.getElementById("save").onclick = function() { 
    	//发送查询请求并调用
    	//new一个XMLHttpRequest()
             var request;
             if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
               request=new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
               reques=new ActiveXObject("Microsoft.XMLHTTP");
             }
    	//因为是post请求,请求的地址不需要带参数
    	request.open("POST", "server.php");
    	//post请求,数据的参数构造,传入id为id为staffName,id为staffNumber,id为staffSex和id为staffJob的值
    	var data = "name=" + document.getElementById("staffName").value 
    	                  + "&number=" + document.getElementById("staffNumber").value 
    	                  + "&sex=" + document.getElementById("staffSex").value 
    	                  + "&job=" + document.getElementById("staffJob").value;
    	//因为是post请求,所以需要设置HTTP头信息.而且必须在open与send之间,否则出现异常.
    	request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    	request.send(data);
    	request.onreadystatechange = function() {
    		if (request.readyState===4) {
    			if (request.status===200) { 
    				document.getElementById("createResult").innerHTML = request.responseText;
    			} else {
    				alert("发生错误:" + request.status);
    			}
    		} 
    	}
    }
    </script>
    </body>
    </html>
    

    注意:
    GET方式:
    (1)使用GET方式发送请求时,地址的参数需要编码,为避免乱码
      数据以问号开始,名和值之间用等号链接,名值对之间用和号(&)分隔。使用GET方式发送的数据常常被称为查询字符串

    xhr.open("get","example.php?name1=value1&name2=value2",true)

    (2)避免缓存
    为了保证参数的绝对唯一性,需要加 时间戳 或随机数

    测试:
    F12的network

    在按钮中输入101,点击查询
    双击左侧出现的那条信息,在右侧可看到服务器的信息

    相关问题:
    问:php地址栏输入参数问题,为什么可以在地址栏直接搜索number查询员工,我没看到哪里有ajax请求啊??
    答:
    php页面中模拟了一个二维数组作为数据库存储的数据,在地址栏通过键值对的形式只是在php页面中增加这样一个员工信息,用来验证php页面是否有语法错误,是不需要通过客户端问:
    向服务器发送请求的
    POST http://localhost:8080/ajaxdemo/server.php User-Agent: Fiddler Host: localhost:8080 Content-Type: application/x-www-form-urldecoded Content-Length: 50 Request Body name=欧阳锋&number=104&sex=男&job=测试经理
    结果是“参数错误,员工信息填写不全”这是怎么回事啊?
    答:
    post发送的信息是经过哈希值加密的,加密是encoded,解密是decoded.
    Content-Type: application/x-www-form-urldecoded这是改成encoded。

    八.json格式

    JSON,就是一种数据传输格式而已,其实JSON最大的用处是处理JavaScript和web服务器端之间数据交换。

    JSON结构共有2种:
    (1)对象结构;
    (2)数组结构;
    1)JSON对象结构
    对象结构是使用大括号“{}”括起来的,大括号内是由0个或多个用英文逗号分隔的“关键字:值”对(key:value)构成的。
    语法:

    var jsonObj =
    {
       "键名1":值1,
       "键名2":值2,
       ……
       "键名n":值n
    }
    

    说明:
    jsonObj指的是json对象。对象结构是以“{”开始,到“}”结束。其中“键名”和“值”之间用英文冒号构成对,两个“键名:值”之间用英文逗号分隔。
    注意,这里的键名是字符串,但是值可以是数值、字符串、对象、数组或逻辑true和false。

    (1)从JSON中读数据

    jsonObj.key
    jsonObj["key"]
    

    说明:
    jsonObj指的是JSON对象,key指的是键名。读取JSON数据使用的是“.”操作符,这个跟JavaScript对象读取属性值是差不多的。
    比如:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <script type="text/javascript">
            var obj =
            {
                "name":"123",
                "age":23,
                "hobby":"562",
                }
            }
            //读取JSON数据
            document.write("名字是:"+obj.name+"
    ");
            document.write("第一项爱好是:"+obj.hobby);
        </script>
    </head>
    <body>
    </body>>
    </html>
    

    结果:
    输出:名字是:123 第一项爱好是:567
    (2)向JSON写数据
    对于JSON对象结构,要往JSON中增加一条数据,也是使用“.”操作符。
    语法:

    jsonObj.key = 值;
    jsonObj["key"] = 值;
    

    说明:
    jsonObj指的是JSON对象,key指的是键名
    例子

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <script type="text/javascript">
            var obj =
            {
                "name":"小名",
                "age":23,
                 "hobby":"dance",
                }
            }
            obj.sex = "男";  //或者obj["sex"]="男";
            document.write("性别是:"+obj.sex);
        </script>
    </head>
    <body>
    </body>
    </html>
    

    结果:
    输出 性别是:男
    (3)修改JSON中的数据
    对于JSON对象结构,要修改JSON中的数据,也是使用“.”操作符。
    语法:
    jsonObj.key = 新值;
    举例:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <script type="text/javascript">
             var obj =
            {
                "name":"小名",
                "sex":"男",
                "age":23,
                "hobby":"dance",
                }
            }
            obj.name = "小杰";  //或者obj["name"]="小杰";
            document.write("姓名是:"+obj.name);
        </script>
    </head>
    <body>
    </body>
    </html>
    

    输出:姓名是:小杰
    (4)删除JSON中的数据
    对于JSON对象结构,我们使用delete关键字来删除JSON中的数据。
    语法:
    delete jsonObj.key;
    举例:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <script type="text/javascript">
             var obj =
            {
                "name":"小名",
                "sex":"男",
                "age":23,
                "hobby":"dance",
                }
            }
            delete obj.age;
            if(obj.age==null)
            {
                alert("年龄项已经被删除!");
            }
        </script>
    </head>
    <body>
    </body>
    </html>
    

    (5)遍历JSON对象
    对于JSON对象结构,可以使用for…in…循环来遍历JSON对象中的数据。

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <script type="text/javascript">
            var obj =
            {
                "name":"小名",
                "age":23,
                "sex":"男",
            }
            for(var a in obj)
            {
                if(a=="name")
                {
                    document.write("姓名是:"+obj[a]);
                }
            }
        </script>
    </head>
    <body>
    </body>
    </html>
    

    弹出 姓名是:小名
    1)JSON数组结构
    JSON数组结构是用中括号“[]”括起来,中括号内部由0个或多个以英文逗号“,”分隔的值列表组成。
    语法:

    [
        {
            "键名1":值1,
            "键名2":值2
        },
        {
            "键名3":值3,
            "键名4":值4
        },
        ……
    ]
    

    说明:
    arr指的是json数组。数组结构是以“[”开始,到“]”结束
    注意,这里的键名是字符串,但是值可以是数值、字符串、对象、数组或逻辑true和false。

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script type="text/javascript">
            var arr =
            [
                {
                    "name":"小光",
                    "age":23,
                    "sex":"男"
                },
                {
                    "name":"小红",
                    "age":21,
                    "sex":"女"
                }
            ]
            //读取JSON数据
            document.write("第一个游客的名字是:"+arr[0].name+"<br>");
            document.write("第二个游客的性别是:"+arr[1].sex+"<br>");
        </script>
    </head>
    <body>
    </body>
    </html>
    

    弹出 第一个游客的名字是:小光
    第二个游客的性别是:女
    3)json解析:将JSON字符串转换为JSON对象
    eval()和parse()方法
    由于eval方法不会检验join的格式是否正确,会把里面的一些JS方法也一并执行,所以非常危险,例如容易被指向而恶意网站,
    -----不建议使用
    JSON.parse()较好,会解析出错误。

    //例子:首先定义了JSON字符串jsondata
    eval()方法:
    var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}';
    var jsonobj=veal('('+jsondata+')');
    alert(jsonobj.staff[0].name);
    parse()方法:
    var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}';
    var jsonobj=JSON.parse(jsondata);
    alert(jsonobj.staff[0].name);
    

    都可以,若把age后的70改成alert(123);若用eval()方法,发现页面是先弹出123,再弹出洪七;也就是说用eval不仅解析了字符串,还执行了JS里的方法
    用parse()解析字符串,发现会抛出一个错误。
    这说明用eval()不会看json是否合法,eval非常危险。所以尽量使用JSON.parse方法,来解析json里的字符串,而且还可以解析出json里的一些错误。
    而JSON.parse在解释JSON时会检验JOIN的格式,如果格式不对,会报错,而且不会执行JSON里面的JS方法。我们平时应该多用JOSN.parse,少用eval方法。
    案例:

    var people = {
        "programmers": [{
            "firstName": "Brett",
            "lastName": "McLaughlin",
            "email": "aaaa"
        }, {
            "firstName": "Jason",
            "lastName": "Hunter",
            "email": "bbbb"
        }, {
            "firstName": "Elliotte",
            "lastName": "Harold",
            "email": "cccc"
        }],
        "authors": [{
            "firstName": "Isaac",
            "lastName": "Asimov",
            "genre": "sciencefiction"
        }, {
            "firstName": "Tad",
            "lastName": "Williams",
            "genre": "fantasy"
        }, {
            "firstName": "Frank",
            "lastName": "Peretti",
            "genre": "christianfiction"
        }],
        "musicians": [{
            "firstName": "Eric",
            "lastName": "Clapton",
            "instrument": "guitar"
        }, {
            "firstName": "Sergei",
            "lastName": "Rachmaninoff",
            "instrument": "piano"
        }]
    };
    

    要想访问 programmers 列表的第一个条目的姓氏,只需在 JavaScript 中使用下面这样的代码:
    people.programmers[0].lastName;
    注意,数组索引是从零开始的。所以,这行代码首先访问 people变量中的数据;然后移动到称为 programmers的条目,再移动到第一个记录([0]);最后,访问 lastName键的值。结果是字符串值 “McLaughlin”。

    people.authors[1].genre  // Value is "fantasy"
    people.musicians[3].lastName // Undefined. This refers to 
    the fourth entry, and there isn't one
    people.programmers[2].firstName // Value is "Elliotte"
    

    利用这样的语法,可以处理任何 JSON 格式的数据,而不需要使用任何额外的 JavaScript 工具包或 API。
    资料:http://www.sojson.com/(在线检验JOSN语法是否正确)

    参考资料:
    Ajax全接触:http://www.imooc.com/learn/250

  • 相关阅读:
    ASP.net MVC 构建layui管理后台(构造基础仓储)<1>
    ASP.net MVC 构建layui管理后台(整体效果)
    搭建私有 Nuget 服务器教程(1)
    SSAS数据集Cube不存在或者尚未处理
    浅谈MDX处理空值NULL及格式化结果
    Zoey.Dapper--Dapper扩展之把SQL语句放到文件中
    Polly每次重试执行不同的操作
    Exceptionless应用--自定义插件
    Fiddler开启Https的时候出现unable to configure windows to trust Fiddler Root certificate问题
    ASP.NET Core 中的配置
  • 原文地址:https://www.cnblogs.com/wanghuih/p/5884038.html
Copyright © 2011-2022 走看看