JSON&AJAX

XP發表於2020-11-14

JSON

  1. 定義:JSON(JavaScript Object Notation, JS 物件簡譜)是一種輕量級的資料交換格式。它基於 ECMAScript(歐洲計算機協會制定的 JS 規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。

  2. 語法:

    1. 基本規則

      • 資料在名稱/值對中:json資料是由鍵值對構成的
      • 鍵用引號(單雙都行)引起來,也可以不使用引號
      • 值得取值型別:
        1. 數字(整數或浮點數 number)
        2. 字串(在雙引號中 string)
        3. 邏輯值(true 或 false)
        4. 陣列(在方括號中) {"persons":[{},{}]}
        5. 物件(在花括號中) {"address":{"province":"陝西"....}}
        6. null
      • 資料由逗號分隔:多個鍵值對由逗號分隔
      • 花括號儲存物件:使用{}定義json 格式
      • 方括號儲存陣列:[]
    2. 獲取資料:

      1. json物件.鍵名
      2. json物件["鍵名"]
      3. 陣列物件[索引]
    3. 遍歷

      	//1.定義基本格式
      	var person = {"name": "張三", age: 23, 'gender': true};
      
      	var ps = [{"name": "張三", "age": 23, "gender": true},
      		{"name": "李四", "age": 24, "gender": true},
      		{"name": "王五", "age": 25, "gender": false}];
      	//獲取person物件中所有的鍵和值
      	//for in 迴圈
      	/* for(var key in person){
      		//這樣的方式獲取不行。因為相當於  person."name"
      		//alert(key + ":" + person.key);
      		alert(key+":"+person[key]);
      	}*/
      	//獲取ps中的所有值
      	for (var i = 0; i < ps.length; i++) {
      		var p = ps[i];
      		for(var key in p){
      		      alert(key+":"+p[key]);
      		}
      	}
      
  3. JSON物件和JS物件的轉化

    • JSON 字串轉 JS 物件

      ​ var js物件 = JSON.parse(json物件);

    • JS 物件轉 JSON 字串

      ​ var json物件 = JSON.stringify(js物件);

    	// 寫 JSON,這個格式的字串裡面存一個員工資料 id 1 name zs age 18
            var json1 = '{"id":1,"name":"zs","age":18}'; // JSON
    
            // 寫 JSON,這個格式的字串裡面存兩個個員工資料
            var json2 = '[{"id":1,"name":"zs","age":18}, {"id":2,"name":"ls","age":19}]';     					  			      									
    
            // 寫 JSON,這個格式的字串裡面存一個員工資料
            var json3 = '{"id":1, "name":"zs", "age":18, "dept":{"id":5,"name":"開發部"}}';    													
    
            var jsObj1 = {"id":1, "name":"zs", "age":18}; // JS 物件
            var jsObj2 = {id:1, name:"zs", age:18}; // JS 物件
    
            console.log(json1.name); // undefined
            console.log(jsObj1.name); // zs
            console.log(jsObj2.name); // zs
    
    
            // JSON 字串轉 JS 物件
            console.log(JSON.parse(json1).age);
            console.log(JSON.parse(json2));
            console.log(JSON.parse(json3).dept.name);
            // JS 物件轉 JSON 字串
            console.log(JSON.stringify(jsObj2));
            var json4 = "{'id':1,'name':'zs','age':18}"; // 錯誤格式的 JSON
            console.log(JSON.parse(json4)); // 報錯
    
  4. JSON與JAVA物件的轉換

    開發中一般都會使用第三方的一些 JSON 操作的依賴或者 JAR 包來來完成 Java 物件與 JSON 字串之間的轉換。在 Java 中,轉換 JSON 的依賴或者 JAR 有很多,這裡單講兩種常用:

    • Jackson:在 Spring MVC 中內建支援她,速度也挺快,穩定性比較好。
    • Fastjson:阿里出品,號稱是 Java 領域中轉換 JSON 最快的一個外掛,中文文件比較齊全。
    1. Jackson

      1.0. 使用步驟

      • 匯入jackson的相關jar包,或者依賴

      • 建立Jackson核心物件 ObjectMapper

      • 呼叫ObjectMapper的相關方法進行轉換

        • 轉換方法:

          • writeValue(引數1,obj):將java物件轉為json字串,並將字串返回到:以下幾個引數的各個功能。
            引數1:
            File:將obj物件轉換為JSON字串,並儲存到指定的檔案中

            ​ Writer:將obj物件轉換為JSON字串,並將json資料填充到字元輸出流中
            OutputStream:將obj物件轉換為JSON字串,並將json資料填充到位元組輸出流中

          • writeValueAsString(obj):將java物件轉為json字串,並返回一個字串

          • readValue(String content, Class valueType):將json字串轉換為Java物件

      1.1. 引入依賴

      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.6</version>
      </dependency>
      

      1.2 API使用

      public class Department {
          private Long id;
          private String name;
          private String sn;
          
          getXxx()方法/setXxxx()方法
      }
      
      public class JsonTest {
      
          @Test
          public void testJackson() throws IOException {
              Department department = new Department();
              department.setId(1L);
              department.setName("小豬");
              department.setSn("sn111");
      
              ObjectMapper mapper = new ObjectMapper();
              //序列化:將java物件轉化為Json格式的字串
              String str = mapper.writeValueAsString(department);
            
              //{"id":1,"name":"小豬","sn":"sn111"}
              System.out.println(str);
      
              //將Json物件寫入java物件中
              String str1 = "{\"id\":1,\"name\":\"啦\",\"sn\":\"sn111\"}";
              Department dept = mapper.readValue(str1, Department.class);
              System.out.println(dept.getName());//啦
          }
      }
      
    2. Fastjson

      2.0 使用步驟:

      • 匯入fastjson的相關jar包,或者依賴

      • 使用JSON類的靜態方法

        1. public static String toJSONString(Object object):將java物件轉換為 json字串;

        2. public static T parseObject(String text, Class clazz):將json字

          ​ 符串轉換為Java物件;

      2.1 引入依賴

      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.47</version>
      </dependency>
      

      2.2 AOP使用

      public class JsonTest {
          @Test
          public void testFastJson(){
              Department department = new Department();
              department.setId(1L);
              department.setName("小豬");
              department.setSn("sn111");
              //序列化:將java物件轉化為Json格式的字串
              String str = JSON.toJSONString(department);
              System.out.println(str);
      
              String str2 = {\"id\":1,\"name\":\"ajax\",\"sn\":\"sn111\"}";
              Department dept = JSON.parseObject(str2, Department.class);
              //將Json物件寫入java物件中
              System.out.println(dept.getName());//ajax
          }
      }
      

AJAX

1.概念

ASynchronous JavaScript And XML 非同步的JavaScript 和 XML

AJax 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。 通過在後臺與伺服器進行少量資料交換,Ajax 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新,提升使用者的體驗。傳統的網頁(不使用 Ajax)如果需要更新內容,必須過載整個網頁頁面。

2.非同步和同步

非同步和同步:客戶端和伺服器端相互通訊的基礎上

  • 同步:客戶端必須等待伺服器端的響應。在等待的期間客戶端不能做其他操作。
  • 非同步:客戶端不需要等待伺服器端的響應。在伺服器處理請求的過程中,客戶端可以進行其他的操作。

3. AJAX缺陷

  • AJAX 大量使用了 Javascript 和 AJAX 引擎,而這個取決於瀏覽器的支援。IE5.0 及以上、
    Mozilla1.0、NetScape7 及以上版本才支援,Mozilla 雖然也支援 AJAX ,但是提供XMLHttpRequest 的方式不一樣。所以,使用 AJAX 的程式必須測試針對各個瀏覽器的相容性。
  • AJAX 更新頁面內容的時候並沒有重新整理整個頁面,因此,網頁的後退功能是失效的;有的使用者還經
    常搞不清楚現在的資料是舊的還是已經更新過的。這個就需要在明顯位置提醒使用者“資料已更新”。
  • 對流媒體的支援沒有 Flash、Java Applet 好。AJAX 不支援跨域訪問,更多參見。

4. Jquery實現方式

  1. $.ajax()

    • 語法:$.ajax({鍵值對});

              //使用$.ajax()傳送非同步請求
              $.ajax({
                 //請求路徑
                  url:'',
                  //請求方式:POST/GET
                  type:"POST", 
                  //同步還是非同步(true非同步預設,false同步)
                  async:true,
                  //傳的引數,如果沒有引數,直接寫{}
                  data:{"username":"jack","age":23},
                 /*
                   當伺服器正常應答時,呼叫suceess對應的方法
                   方法中obj為引數,可以起任何名字,代表伺服器傳遞的引數
                 */
                  success:function (data) {
                      alert(data);
                  },
                   error:function () {
                       alert("出錯啦...");
                   },//表示如果請求響應出現錯誤,會執行的回撥函式
                  dataType:"text"//設定接受到的響應資料的格式
           	 });
      

    1. $.get():傳送get請求

      • 語法:$.get(url, [data], [callback], [type])
        • 引數:
          • url:請求路徑
          • data(可選):請求引數
          • callback(可選):回撥函式
          • type(可選):響應結果的型別
    2. $.post():傳送post請求

      • 語法:$.post(url, [data], [callback], [type])
        • 引數:
          • url:請求路徑
          • data(可選):請求引數
          • callback(可選):回撥函式
          • type(可選):響應結果的型別