Ajax(2) —— Ajax接收JSON數據

来源:https://www.cnblogs.com/yif0118/archive/2020/06/14/13125751.html
-Advertisement-
Play Games

1. Ajax接收JSON數據 JSON:JavaScript對象表示法(JavaScript Object Notation)。JSON是一種存儲和交換文本信息的語法。因為JSON比XML更輕量,效率更高,更易解析,所以在Ajax中前後臺傳輸數據一般都使用的是JSON格式。 1.1.JSON與XM ...


1.   Ajax接收JSON數據

JSON:JavaScript對象表示法(JavaScript Object Notation)。JSON是一種存儲和交換文本信息的語法。因為JSON比XML更輕量,效率更高,更易解析,所以在Ajax中前後臺傳輸數據一般都使用的是JSON格式。

1.1.JSON與XML的對比

數據格式

特點

JSON

JSON 是純文本

JSON 具有“自我描述性”(人類可讀)

JSON 具有層級結構(值中存在值)

JSON 可通過 JavaScript eval()進行解析

JSON 數據可使用 AJAX 進行傳輸

XML

XML是文檔結構,節點複雜

XML可以通過JavaScript解析,需要迴圈遍歷DOM讀取節點信息

XML厚重且讀取效率低

 

 

 

 

 

 

 

 

 

 

 

 

1.2.JSON語法

JSON語法是JavaScript語法的子集。

JSON語法的規則:

  • 數據在名稱/值對中
  • 數據由逗號分隔
  • 花括弧保存對象
  • 方括弧保存數組

JSON數據的書寫格式時:名稱/值對,即欄位名稱(在雙引號中),後面一個冒號,對應是值,JSON的值可以是:數字(整數或浮點數)、字元串(在雙引號中)、邏輯值(true或false)、數組(在方括弧中)、對象(在花括弧中)、null。

常見的JSON語法書寫:

<script type="text/javascript">
        var json01 = {}; //json的第一種寫法:json對象
        var json02 = []; //json的第二種寫法:json數組
        // json對象一般寫法
        var json03 = {
            name:"張小三",
            age:45,
            sex:true
        };
        // json對象標準格式
        var json03_1 = {
            "name":"張小三",
            "age":45,
            "sex":true
        };
        //json數組
        var json04 = [{
            name:"張小三",
            age:45,
            sex:true
        },{
            name:"李華",
            age:20,
            sex:false
        }
        ];
        var json05 = [{
            name:"張小三",
            age:45,
            sex:true,
            department:{
                id:1,
                name:"IT部",
                employees:[
                {name:"xxx", age:23},
                {name:"yyy", age:24}
                ]
            }
        },{
            name:"李華",
            age:20,
            sex:false
        }
        ];
</script>

1.3.JSON文件

  • JSON 文件的文件類型是 ".json"
  • JSON 文本的 MIME 類型是 "application/json"

1.4.JSON使用

JSON最常見的用法之一,是從web伺服器上讀取JSON格式的字元串數據,將JSON數據轉化為JavaScript對象,然後在網頁上使用該數據。

轉化JSON格式字元串為JSON對象的方式有兩種:

①使用JavaScript函數eval()

<script type="text/javascript">
        //最標準的json格式:key必須要加雙引號
        var formatJson = {
            "name" : "黃小邪",
            "age" : 23,
            "sex" : true
        };
        //①jsonStr轉json對象方式一:
        //eval:計算javascript字元串,並把它作為腳本代碼來執行
        //前臺接收到的是json字元串格式,拿數據需要把字元串轉化成json對象
        var jsonStr = '{name : "黃小邪", age : 23, "sex" : true}';
        //註意:使用eval轉換jsonStr,必須前後加括弧,這裡不區分是否標準格式
        var jsonObj = eval("("+ jsonStr +")");
        console.debug(jsonObj);
</script>

②使用JSON解析器

eval()函數可以編譯並執行任何JavaScript代碼,使用eval()隱藏了一個潛在的安全問題。

使用JSON解析器將JSON字元串轉換為JavaScript對象是更安全的做法。

JSON解析器只能識別JSON字元串文本,不會編譯腳本,相對解析速度更快,具有拿來即用的便捷。

使用JSON解析器:

①需要導入JSON轉換JSONObj相關jar包;

 

②轉換對象可以是任何JSON字元串格式的文本,但是必須是標準的JSON格式:

//②jsonStr轉json對象方式二:
var jsonStr2 = '{"name" : "黃小邪", "age" : 23, "sex" : true}';
//註意:使用JSON.parse轉換jsonStr必須保證jsonStr是標準格式的字元串
var jsonObj2 = JSON.parse(jsonStr2);
console.debug(jsonObj2);

1.5.JSON與Ajax實現二級聯動實例

這裡使用JSON字元串操作並向前臺傳輸JSON格式的數據來展示JSON與Ajax之間的操作實現。

後臺:

虛擬了兩個省、市Domain並提供載入獲取省、市的方法供Servlet向前臺傳輸數據:

City.java:

/**
 * 城市對象
 * 
 */
public class City {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public City() {

    }

    public City(Long id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    /**
     * 根據省份id查詢省份中的城市!
     * 
     * @return
     */
    public static List<City> getCityByProvinceId(Long id) {
        
        List<City> citys = new ArrayList<City>();
        
        if (id == 1) {
            citys = Arrays.asList(
                    new City(1L,"成都"),
                    new City(2L,"南充"),
                    new City(3L,"綿陽"),
                    new City(4L,"遂林"),
                    new City(5L,"達州"),
                    new City(6L,"德陽"),
                    new City(7L,"樂山")
            );
        } else if (id == 2) {
            citys = Arrays.asList(
                    new City(11L,"廣州"),
                    new City(12L,"佛山"),
                    new City(13L,"東莞")
            );
        } else if (id == 3) {
            citys = Arrays.asList(
                    new City(21L,"昆明"),
                    new City(22L,"玉溪"),
                    new City(23L,"麗江")
            );
        }
        return citys;
    }
}

Province.java:

public class Province {

    private Long id;
    private String name;

    public Province(Long id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Province() {
        super();
    }

    public static List<Province> getAllProvince() {
        List<Province> provinces = new ArrayList<Province>();
        provinces.add(new Province(1L, "四川"));
        provinces.add(new Province(2L, "廣東"));
        provinces.add(new Province(3L, "雲南"));
        return provinces;
    }
}

提供一個CityProvinceServlet向Ajax提供請求地址:

@WebServlet("/loadData")
public class CityProvinceServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String cmd = req.getParameter("cmd");
        String id = req.getParameter("id");
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/json;charset=UTF-8");

        //載入省
        if(cmd.equals("province")){
            List<Province> provinceList = Province.getAllProvince();
            resp.getWriter().print(JSONSerializer.toJSON(provinceList));
            System.out.println("載入省!");
        }
        //載入市
        else {
            if(id != null && id != ""){
                List<City> cityList = City.getCityByProvinceId(Long.parseLong(id));
                resp.getWriter().print(JSONSerializer.toJSON(cityList));
                System.out.println("載入市!");
            }

        }
    }
}

前臺對應使用Ajax與JSON來解析傳遞過來的JSON格式數據:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>省市二級聯動</title>
    <script type="text/javascript">
        function getAjax(){
            var ajax = null;
            if(XMLHttpRequest){
                ajax = new XMLHttpRequest();
            }else if(ActiveXObject){
                ajax = new ActiveXObject("Microsoft XMLHTTP");
            }
            return ajax;
        }

        function loadProvince() {
            var xhr = getAjax();
            xhr.open("GET", "/loadData?cmd=province");
            xhr.onreadystatechange = function () {
                if(xhr.readyState == 4 && xhr.status == 200){
                    //provinces:[{"id":1,"name":"四川"},{"id":2,"name":"廣東"},{"id":3,"name":"雲南"}]
                    var provinces = xhr.responseText;
                    var jsonObjArr = JSON.parse(provinces);
                    //操作DOM往省級option進行填充數據
                    //首先先創建每個option元素
                    //將jsonObj數據填充進option中
                    jsonObjArr.forEach(
                        function (obj) {
                            var option = document.createElement("option");
                            option.setAttribute("value", obj.id);
                            option.innerHTML = obj.name;
                            document.getElementById("province").appendChild(option);
                        }
                    );
                }
            };
            xhr.send();
        }
        loadProvince();

        function loadCity() {
            //得到id
            var id = document.getElementById("province").value;
            //如果是請選擇,對應就不載入
            if(id == -1){
                document.getElementById("city").innerHTML = "<option>----請選擇----</option>";
                return;
            }
            //每次載入都初始化一次
            document.getElementById("city").innerHTML = "";
            var xhr = getAjax();
            xhr.open("GET", "/loadData?cmd=city&id=" + id);
            xhr.onreadystatechange = function () {
                if(xhr.readyState == 4 && xhr.status == 200){
                    //[{"id":1,"name":"成都"},{"id":2,"name":"南充"},{"id":3,"name":"綿陽"},{"id":4,"name":"遂林"},{"id":5,"name":"達州"},
                    // {"id":6,"name":"德陽"},{"id":7,"name":"樂山"}]
                    var cityes = xhr.responseText;
                    var jsonObjArr = JSON.parse(cityes);
                    jsonObjArr.forEach(
                        function (obj) {
                            var option = document.createElement("option");
                            option.setAttribute("value", obj.id);
                            option.innerHTML = obj.name;
                            document.getElementById("city").appendChild(option);
                        }
                    );
                    //去除掉----請選擇------
                    document.getElementById("city").options.remove(0);
                }
            };
            xhr.send();
        }
    </script>
</head>
<body>
    省級:<select id="province" onchange="loadCity()">
        <option value="-1">----請選擇----</option>
    </select>
    市級:<select id="city">
        <option>----請選擇----</option>
    </select>
</body>
</html>

實現效果如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • redis 的散列可以讓用戶將多個鍵值對存儲到一個 redis 鍵裡面。這裡介紹一些常用命令,以及在 Yii 中的使用。 HMGET HMGET:HMGET key-name key [key …]從散列裡面獲取一個或多個鍵的值。 HMSET HMSET:HMSET key-name key nam ...
  • 一.源碼下載: Windows中的Redis源碼下載:https://github.com/microsoftarchive/redis/tree/3.2 根據官網說明可知,用VS2013編譯,但是必須更新到update5, 否則會出現各種編譯錯誤,確實如此,之前用vs2013的其它版本,出現各種錯 ...
  • Kakfa在大數據消息引擎領域,絕對是沒有爭議的國民老公。 這是kafka系列的第一篇文章。預計共出20篇系列文章,全部原創,從0到1,跟你一起死磕kafka。 本文盤點了 Kafka 的各種術語並且進行解讀,術語可能比較枯燥,但真的是精髓中的精髓! 瞭解Kafka之前我們必須先掌握它的相關概念和術 ...
  • redis 的集合是無序的,集合成員是唯一的,不能重覆。用戶可以快速地對集合執行添加元素操作、移除元素操作以及檢查一個元素是否存在於集合中。這裡介紹一些常用的集合處理命令,併在 Yii 中的使用。 SADD SADD:SADD key-name item [item …]將一個或多個元素添加到集合里 ...
  • Dart語言一些語法特點和編程規範. 本文適合: 日常使用Kotlin, 突然想寫個Flutter程式的Android程式員. ...
  • 目錄:andorid jar/庫源碼解析 HotXposed: 作用: 免重啟手機,實現Xposed hook更新。(當然app是要重啟的) 慄子: 入口: // Hook 入口 public void handleLoadPackage(XC_LoadPackage.LoadPackagePara ...
  • Vuex源碼閱讀(二) store內的getters實現邏輯,介紹Vuex對getter進行了哪些處理。 ...
  • Deno 是什麼?什麼是 Javascript runtime?Deno 會取代 Node.js 嗎? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...