学静思语
Published on 2025-02-15 / 1 Visits
0
0

JSON和Ajax

JSON和Ajax

一、JSON

1.JSON的介绍

  • JSON指的是JavaScript对象表示法(JavaScript Object Notation)
  • JSON是轻量级的文本数据交换格式
  • JSON独立于语言[java,php,asp.net等都可以使用JSON]
  • JSON具有自我描述性,更容易理解

2.JSON的简单使用

  • 代码

    window.onload = function () {
    
        var myJson = {
            name: "李四",
            age:20,
            book:{"name":"活着",prices:20},
            student:[{name:"张三",age: 20},{name:"王五",age:18}],
            array:[12,"haha",30.33]
        }
    
        console.log("name="+ myJson.name);
        console.log("age="+ myJson.age);
        console.log("book.name="+ myJson.book.name);
        console.log("book.prices="+myJson.book.prices);
        console.log("student[0].name"+myJson.student[0].name);
        console.log("student[0].age"+ myJson.student[0].age);
        console.log("array[0]="+myJson.array[0]);
        console.log("array[0]="+myJson.array[1]);
        
    }
    
  • JSON规则

    • 映射(元素/属性)用冒号":"表示,“名称”:值,注意名称是字符串,因此要用双引号引起来,也可以不使用双引号
    • 并列的数据之间用逗号,分离。
    • 映射的集合(对象)用大括号{}表示。
    • 并列数据的集合(数组)用方括号[]表示,[{"名称1":值,"名称2":值},{"名称1":值,"名称2":值}]
    • 元素值类型:string,number,object,array,true,false,null

3.JSON转字符串

  • JSON.stringify(json)功能:将一个JSON对象转换成为JSON字符串

  • JSON.parse(jsonString)功能:将一个json字符串转换成为JSON对象

  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script type="text/javascript">
            window.onload=function () {
                // console.log(JSON)
                var myJson ={
                    name:"李华",
                    age:20,
                    id:123466
                }
                
                var stringify = JSON.stringify(myJson);
                
                // console.log(stringify)
                
                var s = "{\"name\":\"王五\",\"age\":20}";
                
                var parse = JSON.parse(s);
                
                console.log(parse);
                
                console.log("name= ",parse.name)
                 }
             </script>
         </head>
      <body>
                
      </body>
      </html>
    

4.JSON和字符串相互转换注意细节

  • JSON.springify(json对象)会返回对应的string,并不会影响原来的JSON对象
  • JSON.parse(string)函数会返回对应的JSON对象,并不会影响原来string
  • 在定义JSON对象时,可以使用' '表示字符串
  • 但是在把原生字符串转成JSON对象是,必须使用" ",否则会报错
  • JSON.springify(json对象)返回的字符串,都是" "表示的字符串,所以在语法格式正确的情况下,是可以重新转成JSON对象的

5.JSON在java中应用场景

  • 说明

    • java中使用JSON,需要引入第三方的gson.jar
    • Gson是Google提供的用来在java对象和JSON数据之间进行映射的java类库
    • 可以对JSON字符串和Java对象来相互转换
  • 应用场景

    • JavaBean对象和JSON字符串的转换
    • List对象和JSON字符串的转换
    • Map对象和JSON字符串的转换
  • 代码

package com.leon.bean;


import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ClassName:JavaJson
 * Package:com.leon.bean
 * Description:
 *
 * @Author: leon-->ZGJ
 * @Create: 2023/11/16 20:16
 * @Version: 1.0
 */
public class JavaJson {

    public static void main(String[] args) {

        Gson gson = new Gson();
//        javaBean转JSON字符串
//        Book book = new Book("1001","活着");
//
//
//        String json = gson.toJson(book);
//
//        System.out.println(json);
////      JSON字符串转javaBean
////        1.json指的是JSON字符串
////        2.Book.class 指定将JSON字符串转换成Book对象
////        3.底层使用的是反射机制
//        Book book1 = gson.fromJson(json, Book.class);
//
//        System.out.println(book1);

//        把List转换成为JSON字符串
        List<Book> list = new ArrayList<>();
        list.add(new Book("1002","骆驼祥子"));
        list.add(new Book("1003","兄弟"));
        list.add(new Book("1004","许三观卖血记"));

        String json1 = gson.toJson(list);

        System.out.println(json1);
//      JSON字符串转换成List对象
//      如果需要把JSON字符串转成集合这样复杂的类型,需要使用Gson提供的一个类:TypeToken
//      TypeToken是一个自定义泛型类,然后通过TypeToken来指定我们需要的类型
        /**
         * package com.google.gson.reflect;
         * public class TypeToken<T> {
         *     final Class<? super T> rawType;
         *     final Type type;
         *     final int hashCode;
         *
         *     protected TypeToken() {
         *         this.type = getSuperclassTypeParameter(this.getClass());
         *         this.rawType = Types.getRawType(this.type);
         *         this.hashCode = this.type.hashCode();
         *     }
         */
        /*
        *   1.返回的是一个完整路径java.util.List<com.leon.bean.Book>
        *   2.需要的得到类型的完整路径,然后进行底层反射
        *   3.因而提供TypeToken来获取类型的完整路径
        * new TypeToken<List<Book>>() {}
        * 为什么要加一个{},不直接使用这个(new TypeToken<List<Book>>())呢?
        *   1. 因为TypeToken的无参构造器的权限是protected,在在不同包下不能调用无参构造器,只有子类,同包,同类
        *       访问修饰符       同类  同包  子类  不同包
        *       public          √    √     √    √
        *       protected       √    √     √    ×
        *      没有修饰符(默认)   √    √     ×    ×
        *       private         √    ×     ×    ×
        *   2.如果直接使用new TypeToken<List<Book>>()就相当于调用了无参构造器,因而会报错
        *   3.所以使用匿名内部类的形式来解决问题new TypeToken<List<Book>>() {}
        *   4.new TypeToken<List<Book>>() {}这个是TypeToken的子类,通过调用子类的无参构造器来调用TypeToken的无参构造器,这样就满足条件了
        *     因为子类的无参构造器默认有super()这个调用,来调用父类的无参构造器
        *
        *
        */

        Type type = new TypeToken<List<Book>>() {}.getType();
        System.out.println("Type= " + type);
        List<Book> o = gson.fromJson(json1, type);
        System.out.println(o);
//        Map对象转换成JSON字符串
        Map<String,Book> map = new HashMap<>();
        map.put("key1",new Book("1005","三国演义"));
        map.put("key2",new Book("1006","西游记"));
        String json = gson.toJson(map);
        System.out.println(json);
//        JSON字符串转换成Map对象
        Map o1 = gson.fromJson(json, new TypeToken<Map<String, Book>>() {}.getType());
        System.out.println(o1);


    }

}

二、JavaScript中的原生Ajax

1.基本介绍

  • AJAX即“Asynchronous JavaScript And XML”(异步JavaScript和XML)
  • Ajax是一种浏览器异步发起请求,局部更新页面的技术

2.Ajax经典应用场景

  • 搜索引擎根据用户输入关键字,自动提示检索关键字
  • 动态加载数据,按需取得数据【树形菜单、联动菜单.....】
  • 改善用户体验。【输入内容前提示、带进度条文件上传......】
  • 电子商务应用。【购物车、邮件订阅.....】
  • 访问第三方服务。【访问搜索服务、rss阅读器】
  • 页面局部刷新

3.通讯方式比对

  • 传统web

    image-20231117105137669

  • Ajax

    image-20231117105202068

三、jQuery中的Ajax

1. jQuery中的Ajax函数

  • $.ajax()方法

    • url:请求的URL地址
    • type:请求的方式get或post
    • date:发送到服务器的数据,将自动转换为请求字符串格式
    • success:成功的回调函数
    • error:失败的回调函数
    • dataType:返回的数据类型,常用JSON或text
  • $.get()方法

    • url:请求的URL地址
    • date:发送到服务器的数据,将自动转换为请求字符串格式
    • success:成功的回调函数
    • dataType:返回的数据类型,xml,html,script,json,text
    • 说明$.get()和$.post()底层还是使用$.ajax()方法来实现异步请求
  • $.post()方法

    • url:请求的URL地址
    • date:发送到服务器的数据,将自动转换为请求字符串格式
    • success:成功的回调函数
    • dataType:返回的数据类型,xml,html,script,json,text
    • 说明$.get()和$.post()底层还是使用$.ajax()方法来实现异步请求
  • $.getJSON()方法

    • url:请求的URL地址
    • date:发送到服务器的数据,将自动转换为请求字符串格式
    • success:成功的回调函数
    • $.getJson()底层使用$.ajax()方法来实现异步请求
    • 使用$.getJson()方法需要满足是get请求方式和JSON数据格式才可以
  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户注册</title>
        <script type="text/javascript" src="./script/jquery-3.7.1.min.js"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                $("#checkButton").click(function (){
          
                    // $.ajax({
                    //     /*
                    //         + url:请求的URL地址
                    //         + type:请求的方式get或post
                    //         + date:发送到服务器的数据,将自动转换为请求字符串格式
                    //         + success:成功的回调函数
                    //         + error:失败的回调函数
                    //         + dataType:返回的数据类型,常用JSON或text
                    //      */
                    //     url:"/jsonandajax/checkUserServlet2",
                    //     type:"post",
                    //     data:{
                    //         // 为什么这里使用一个new Date()
                    //         //是为防止缓存,因为有的浏览器会有缓存,如果数据没有发生变化,不给你传输新的数据
                    //         // 如果每次都发送日期,浏览器就会每次都发送一个新请求,保证数据实时更新
                    //         username:$("#uname").val(),
                    //         date:new Date()
                    //     },
                    //     success:function (data,status,xhr) {
                    //         // console.log("成功~~")
                    //         // console.log("data=",data);
                    //         // console.log("status=",status);
                    //         // console.log("xhr=",xhr);
                    //         if(data.name != ""){
                    //             $("#myres").val("用户名不可用")
                    //             // 此时的data是一个对象。要转换成一个字符串
                    //             $("#div1").text(JSON.stringify(data))
                    //         }else {
                    //             $("#myres").val("用户名可用")
                    //             $("#div1").text(JSON.stringify(data))
                    //         }
                    //     },
                    //     error:function () {
                    //         console.log("失败~~")
                    //     },
                    //     dataType:"json"
                    // })
                    // $.get(
                    //     "/jsonandajax/checkUserServlet2",
                    //     {
                    //         // 为什么这里使用一个new Date()
                    //         //是为防止缓存,因为有的浏览器会有缓存,如果数据没有发生变化,不给你传输新的数据
                    //         // 如果每次都发送日期,浏览器就会每次都发送一个新请求,保证数据实时更新
                    //         username:$("#uname").val(),
                    //         date:new Date()
                    //     },
                    //     function (data,status,xhr) {
                    //         // console.log("成功~~")
                    //         // console.log("data=",data);
                    //         // console.log("status=",status);
                    //         // console.log("xhr=",xhr);
                    //         if(data.name != ""){
                    //             $("#myres").val("用户名不可用")
                    //             // 此时的data是一个对象。要转换成一个字符串
                    //             $("#div1").text(JSON.stringify(data))
                    //         }else {
                    //             $("#myres").val("用户名可用")
                    //             $("#div1").text(JSON.stringify(data))
                    //         }
                    //     },
                    //     "json"
                    // )
                    // $.post(
                    //     "/jsonandajax/checkUserServlet2",
                    //     {
                    //         // 为什么这里使用一个new Date()
                    //         //是为防止缓存,因为有的浏览器会有缓存,如果数据没有发生变化,不给你传输新的数据
                    //         // 如果每次都发送日期,浏览器就会每次都发送一个新请求,保证数据实时更新
                    //         username:$("#uname").val(),
                    //         date:new Date()
                    //     },
                    //     function (data,status,xhr) {
                    //         // console.log("成功~~")
                    //         // console.log("data=",data);
                    //         // console.log("status=",status);
                    //         // console.log("xhr=",xhr);
                    //         if(data.name != ""){
                    //             $("#myres").val("用户名不可用")
                    //             // 此时的data是一个对象。要转换成一个字符串
                    //             $("#div1").text(JSON.stringify(data))
                    //         }else {
                    //             $("#myres").val("用户名可用")
                    //             $("#div1").text(JSON.stringify(data))
                    //         }
                    //     },
                    //     "json"
                    // )
                    $.getJSON(
                        "/jsonandajax/checkUserServlet2",
                        {
                            // 为什么这里使用一个new Date()
                            //是为防止缓存,因为有的浏览器会有缓存,如果数据没有发生变化,不给你传输新的数据
                            // 如果每次都发送日期,浏览器就会每次都发送一个新请求,保证数据实时更新
                            username:$("#uname").val(),
                            date:new Date()
                        },
                        function (data,status,xhr) {
                            // console.log("成功~~")
                            // console.log("data=",data);
                            // console.log("status=",status);
                            // console.log("xhr=",xhr);
                            if(data.name != ""){
                                $("#myres").val("用户名不可用")
                                // 此时的data是一个对象。要转换成一个字符串
                                $("#div1").text(JSON.stringify(data))
                            }else {
                                $("#myres").val("用户名可用")
                                $("#div1").text(JSON.stringify(data))
                            }
                        }
                    )
                });
            });
        </script>
    </head>
    <body>
    <h1>用户注册~</h1>
    <form action="/jsonandajax/checkUserServlet2" method="post">
        用户名字:<input type="text" name="username" id="uname">
        <input type="button" id="checkButton" value="验证用户名">
        <input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
        用户密码:<input type="password" name="password"><br/><br/>
        电子邮件:<input type="text" name="email"><br/><br/>
        <input type="submit" value="用户注册">
    </form>
    <h1>返回的json数据</h1>
    <div id="div1"></div>
    </body>
    </html>
    

Comment