• AJAX学习笔记——JSON


    JSON基本概念

    1.JSON : JavaScript对象表示法( JavaScript Object Notation )
    2.JSON是存储和交换文本信息的语法,类似XML。它采用键值对的方式来组织,易于人们阅读和编写,同时也易于机器解析和生成
    3.JSON是独立于语言的,也就是说不管什么语言,都可以解析json,只需要按照json的规则来就行

    JSON与XML比较

    1.json的长度和xml格式比起来很短小
    2.json读写的速度更快
    3.json可以使用JavaScript内建的方法直接进行解析,转换成Javascript对象非常方便

    JSON语法规则

    1.JSON数据的书写格式是:名称/值对。
    名称/值对组合中的名称写在前面(在双引号中) ,值对写在后面(同样在双引号中) ,中间用冒号隔开:比如"name":"郭靖"
    2.json的值可以是下面这些类型:
    数字(整数或浮点数) , 比如123, 1.23
    字符串(在双引号中)
    逻辑值( true或false )
    数组(在方括号中)
    对象(在花括号中)
    null

    JSON解析

    1.eval和JSON.parse
    2.在代码中使用eval是很危险的!特别是用它执行第三方的JSON数据(其中可能包含恶意代码)时,尽可能使用JSON.parse()方法解析字符串本身,该方法还可以捕捉JSON中的语法错误。
    使用eval解析

    var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"郭黄蓉","age":30}]}';
    var jsonobj = eval('('+jsondata+')');
    alert(jsonobj.staff[0].name);
    

    用eval方式不光解析了JSON字符串,而且还执行了JSON字符串中的一些方法,不会去看JSON字符串是否合法,JSON中的JS方法会直接执行,非常危险。
    注意:在代码中无论何时,当你使用eval方法都是非常危险的,除非你能确定其中eval的参数确实是自己可以控制的、是安全的,尤其是使用eval方法去执行第三方的JSON数据,有可能会包含恶意代码,所以,在实际使用中,尽量使用JSON.parse方法解析JSON字符串。而且使用JSON.parse可以预报JSON字符串中的错误。

    var jsondata='{"staff":[{"name":"洪七","age":alert(123)},{"name":"郭靖","age":35},{"name":"郭黄蓉","age":30}]}';
    var jsonobj = eval('('+jsondata+')');
    alert(jsonobj.staff[0].name);
    

    使用JSON.parse解析

    var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"郭黄蓉","age":30}]}';
    var jsonobj = JSON.parse(jsondata);
    alert(jsonobj.staff[0].name);
    

    JSON校验工具

    jsonlint.com

    JSON格式约定

    约定所有从服务器返回的JSON字符串格式如下:

    {
        "success":true,//是否成功,代表是否正确去执行了。逻辑是否成功的标记
        "msg":"xxx",  //请求的返回值,"success":false 给出的错误信息
        "data":"xxx" //请求返回的数据
    }
    

    要做到这样的约定,需要对服务器端进行改造

    //告诉服务器端传给你的是json字符串
    header("Content-Type: application/json;charset=utf-8"); 
    
    //所有的返回值采用json的方式
    //php
    echo '{"success":false,"msg":"参数错误"}';
    $result = '{"success":false,"msg":"没有找到员工。"}';
    '{"success":true,"msg":"找到员工:员工编号:"}';
    echo '{"success":false,"msg":"参数错误,员工信息填写不全"}';
    echo '{"success":true,"msg":"员工:' . $_POST["name"] . ' 信息保存成功!"}';
    

    完整的服务器端代码:serviceJson.php

    <?php
    //设置页面内容是html编码格式是utf-8
    //header("Content-Type: text/plain;charset=utf-8"); 
    //告诉服务器端传给你的是JSON字符串
    header("Content-Type: application/json;charset=utf-8"); 
    //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 '{"success":false,"msg":"参数错误"}';
    		return;
    	}
    	//函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    	//global 关键词用于访问函数内的全局变量
    	global $staff;
    	//获取number参数
    	$number = $_GET["number"];
    	$result = '{"success":false,"msg":"没有找到员工。"}';
    	
    	//遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
    	foreach ($staff as $value) {
    		if ($value["number"] == $number) {
    			$result = '{"success":true,"msg":"找到员工:员工编号:' . $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 '{"success":false,"msg":"参数错误,员工信息填写不全"}';
    		return;
    	}
    	//TODO: 获取POST表单数据并保存到数据库
    	
    	//提示保存成功
    	echo '{"success":true,"msg":"员工:' . $_POST["name"] . ' 信息保存成功!"}';
    }
    
    ?>
    

    完整的客户端代码:demoJson.html

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Demo</title>
    <style>
    	body,input,button,select,h1{
    		font-size: 30px;
    		line-height: 1.8;
    	}
    </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>
    	
    	<script>
    		document.getElementById("search").onclick=function(){
    			//发送Ajax查询请求并处理
    			var request = new XMLHttpRequest();
    			request.open("GET","../JSON/serviceJson.php?number="+document.getElementById("keyword").value);
    			request.send();
    			request.onreadystatechange=function(){
    				if(request.readyState===4){
    					if(request.status===200){						
    						//调用异步的GET请求,通过服务器端返回的值,去局部更新页面上面的信息,而不刷新整个页面
    						//document.getElementById("searchResult").innerHTML=request.responseText;
    						
    						var data=JSON.parse(request.responseText);
    						if(data.success){
    							document.getElementById("searchResult").innerHTML=data.msg;
    						}else{
    							document.getElementById("searchResult").innerHTML="出现错误:"+data.msg;
    						}
    					}else{
    						alert("发生错误"+request.status);
    					}
    				}
    			}
    		}
    		
    		document.getElementById("save").onclick=function(){
    			//发送Ajax查询请求并处理
    			var request = new XMLHttpRequest();
    			request.open("POST","../JSON/serviceJson.php");
    			var data="name="+document.getElementById("staffName").value
    					        +"&number="+document.getElementById("staffNumber").value
    							+"&sex="+document.getElementById("staffSex").value
    							+"&job="+document.getElementById("staffJob").value;
    			request.setRequestHeader("Content-type"," application/x-www-form-urlencoded");
    			request.send(data);
    			request.onreadystatechange=function(){
    				if(request.readyState===4){
    					if(request.status===200){
    						var data=JSON.parse(request.responseText);
    						if(data.success){
    							document.getElementById("createResult").innerHTML=data.msg;
    						}else{
    							document.getElementById("createResult").innerHTML="出现错误:"+data.msg;
    						}					
    					}else{
    						alert("发生错误"+request.status);
    					}
    				}
    			}
    		}
    	</script>
    </body>
    </html>
    
    
  • 相关阅读:
    引用与指针的区别联系
    单链表热点面试题
    C语言实现的单链表
    C语言实现的顺序表
    自己实现的库函数2(memset,memcmp,memcpy,memmove)
    自己实现的库函数1(strlen,strcpy,strcmp,strcat)
    Python文件练习_注册
    Python文件练习_自动生成密码文件
    Python文件练习_读取文件并计算平均分
    Python学习笔记七_文件读写
  • 原文地址:https://www.cnblogs.com/songsongblue/p/11906761.html
Copyright © 2020-2023  润新知