欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS对象-JSON转换,XHR 实例演示,Fetch API 与 async, await 实例演示

程序员文章站 2022-03-27 08:28:14
...

JSON 基础知识

  • json 是通用的,轻量化的 “数据交互格式”,用于 “前后端数据通信”
  • json 独立于编程语言,本质是一个格式化字符串
  • json 借用了 js 对象字面量的语法,简洁高效,已替代了传统的 xml 格式
  • json 不是 js 对象, 但它可以与 js 对象之间相互转换
  • json 数据类型: 不支持 undefined ,没意义的数据类型
  • json: 本质就是 js 对象的序列化, 字符串表示
  • js 对象[前端] -> json 字符串[后端], js 对象的序列化

JSON.stringify: obj -> json, JS 对象转为 json 字符串

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>JSON基础知识</title>
  8. </head>
  9. <body></body>
  10. <script>
  11. // JS对象
  12. const staff = {
  13. id: 1,
  14. name: "DASHU",
  15. email: "help_10086@foxmail.com",
  16. isMarried: "0",
  17. gender: "0",
  18. bophan: "HR-Dept",
  19. congviec: "HR",
  20. salary: 20000000,
  21. /* toJSON() {
  22. // 只返回 name,email
  23. return `name:${this.name}, email=${this.email}`;
  24. }, */
  25. };
  26. // console.log(staff);
  27. // console.log(typeof staff);
  28. // 1、序列化json: JSON.stringify
  29. let jsonStr = JSON.stringify(staff);
  30. // 第二个参数: array, callback
  31. // array
  32. jsonStr = JSON.stringify(staff, ["name", "email"]);
  33. // callback,做一些操作
  34. jsonStr = JSON.stringify(staff, (key, value) => {
  35. switch (key) {
  36. case "gender":
  37. return value === "0" ? "男" : "女";
  38. case "salary":
  39. return undefined;
  40. default:
  41. return value;
  42. }
  43. });
  44. // 第三个参数: 格式化
  45. jsonStr = JSON.stringify(staff, null, 2);
  46. jsonStr = JSON.stringify(staff, null, "**");
  47. console.log(jsonStr);
  48. // console.log(typeof jsonStr);
  49. // JSON字符串
  50. // verify: https://www.bejson.com/
  51. // 1. 所有属性必须使用双引号
  52. // 2. 字符类型的值必须使用双引号
  53. // 3. 不能有undefined
  54. // 4. 最后一个值后不能有逗号
  55. const siteInfo = `
  56. {
  57. "name":"PHP中文网",
  58. "domain":"https://www.php.cn",
  59. "isRecord":true,
  60. "email":"498668472@qq.com",
  61. "address":"合肥市政务新区蔚蓝商务港",
  62. "category":["视频","文章","资源"],
  63. "lesson": {
  64. "name": "第18期Web全栈线上培训班",
  65. "price": 4800,
  66. "content": ["JavaScript", "PHP", "ThinkPHP"]
  67. }
  68. }
  69. `;
  70. </script>
  71. </html>

JSON.parse: json->obj, json 字符串转为 JS 对象

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>JSON基础知识</title>
  8. </head>
  9. <body></body>
  10. <script>
  11. // JSON字符串
  12. // verify: https://www.bejson.com/
  13. // 1. 所有属性必须使用双引号
  14. // 2. 字符类型的值必须使用双引号
  15. // 3. 不能有undefined
  16. // 4. 最后一个值后不能有逗号
  17. const siteInfo = `
  18. {
  19. "name":"PHP中文网",
  20. "domain":"https://www.php.cn",
  21. "isRecord":true,
  22. "email":"498668472@qq.com",
  23. "address":"合肥市政务新区蔚蓝商务港",
  24. "category":["视频","文章","资源"],
  25. "lesson": {
  26. "name": "第18期Web全栈线上培训班",
  27. "price": 4800,
  28. "content": ["JavaScript", "PHP", "ThinkPHP"]
  29. }
  30. }
  31. `;
  32. // 2、jsonStr -> jsObj: json字符串[后端] -> js对象[前端]
  33. // JSON.parse
  34. // 以前用eval
  35. let site = eval("(" + siteInfo + ")");
  36. console.log(site, typeof site);
  37. site = JSON.parse(siteInfo);
  38. site = JSON.parse(siteInfo, function (key, value) {
  39. // console.log(key, "=>", value);
  40. if (key === "email" || key === "address") {
  41. delete this[key];
  42. } else {
  43. return value;
  44. }
  45. });
  46. console.log(site);
  47. // js obj 渲染到页面中
  48. let html = `
  49. <li>网站名称: ${site.name}</li>
  50. <li>网站域名: ${site.domain.slice(8)}</li>
  51. <li>是否备案: ${site.isRecord ? "已备案" : "未备案"}</li>
  52. <li>服务内容:
  53. <ul>
  54. <li style="color:red">1. arry.map()</li>
  55. ${site.category.map((cate) => `<li>${cate}</li>`).join("")}
  56. <li style="color:red">2. arry.reduce()</li>
  57. ${site.category.reduce((acc, cur) => `${acc}</li><li>${cur}`, "")}
  58. </ul>
  59. </li>
  60. <li>课程信息:
  61. <ul>
  62. <li style="color:red"> 1: 根据键名获取值</li>
  63. ${Object.keys(site.lesson)
  64. .map((key) => `<li>${site.lesson[key]}</li>`)
  65. .join("")}
  66. <li style="color: red"> 2: 直接获取值</li>
  67. ${Object.values(site.lesson)
  68. .map((less) => `<li>${less}</li>`)
  69. .join("")}
  70. </ul>
  71. </li>
  72. `;
  73. const ul = document.createElement("ul");
  74. ul.innerHTML = html;
  75. document.body.append(ul);
  76. </script>
  77. </html>

[http://help10086.cn/0110/demo1.html]

传统 XHR 实例演示

    1. 创建对象: new XMLHttpRequest();
    1. 响应类型: xhr.responseType = “json”;
    1. 配置参数: xhr.open(“GET”, url, true);
    1. 请求回调: xhr.onload = () => console.log(xhr.response);
    1. 失败回调: xhr.onerror = () => console.log(“Error”);
    1. 发起请求: xhr.send(null);-
  • xhr 至少监听 2 个事件: load,error, 调用 2 个函数: open,send
  • post 请求,需要设置一下请求头与请求的数据,其它与 get 请求完全相同
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <script src="funcShow.js"></script>
  8. <title>ajax-xhr</title>
  9. </head>
  10. <body style="display: grid; gap: 1em">
  11. <button style="width:166px;" onclick="getStaff1(this)">
  12. 获取员工信息 - XHR
  13. </button>
  14. <script>
  15. // 1. 传统 XHR,是一个对象
  16. /**
  17. * 1. 创建对象: new XMLHttpRequest();
  18. * 2. 响应类型: xhr.responseType = "json";
  19. * 3. 配置参数: xhr.open("GET", url, true);
  20. * 4. 请求回调: xhr.onload = () => console.log(xhr.response);
  21. * 5. 失败回调: xhr.onerror = () => console.log("Error");
  22. * 6. 发起请求: xhr.send(null);
  23. *
  24. * xhr 至少监听2个事件: load,error, 调用2个函数: open,send
  25. * post请求,需要设置一下请求头与请求的数据,其它与get请求完全相同
  26. */
  27. function getStaff1(btn) {
  28. // 1. 创建对象:
  29. const xhr = new XMLHttpRequest();
  30. // 2. 响应类型:
  31. xhr.responseType = "json";
  32. // 3. 配置参数:
  33. let url = "http://help10086.cn/0110/staffs.php";
  34. // url = "http://help10086.cn/0110/staffs.php?msnv=900101";
  35. xhr.open("GET", url, true);
  36. // 4. 请求回调:
  37. xhr.onload = () => {
  38. console.log(xhr.response);
  39. // 渲染到页面中
  40. render(xhr.response, btn);
  41. };
  42. // 5. 失败回调:
  43. xhr.onerror = () => console.log("Error");
  44. // 6. 发起请求:
  45. xhr.send(null);
  46. }
  47. </script>
  48. </body>
  49. </html>

[http://help10086.cn/0110/demo2.html]

Fetch API 与 async, await 实例演示

  • 语法:
    fetch(…)
    .then(…)
    .then(…)
    .catch(…)
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <script src="funcShow.js"></script>
  8. <title>Fetch API</title>
  9. </head>
  10. <body>
  11. <button onclick="getStaff(this)">获取用户信息 - Fetch</button>
  12. <script>
  13. // 实际开发中, 通常不会直接去用Promise,用fetch
  14. // axios : 基于 xhr
  15. // fetch : 基于 promise, 返回一个Promise对象
  16. // console.log(fetch());
  17. /* fetch("https://jsonplaceholder.typicode.com/users")
  18. .then(response => response.json())
  19. .then(json => console.log(json)); */
  20. fetch("http://help10086.cn/0110/staffs.php")
  21. .then((response) => response.json())
  22. .then((json) => console.log(json));
  23. // 同域: 协议相同, 域名相同,端口相同,否则就是跨域请求
  24. // ECMA2017, async, await, 来简化了fetch , 实现同步的方式来编写异步代码
  25. // 异步函数,内部有异步操作
  26. async function getStaff(btn) {
  27. let url = "http://help10086.cn/0110/staffs.php";
  28. // url = "http://help10086.cn/0110/staffs.php?msnv=900101";
  29. //await: 表示后面是一个异步请求,需要等待结果
  30. const response = await fetch(url);
  31. // response响应对象,json():将返回的数据转为json
  32. const result = await response.json();
  33. console.log(result);
  34. // 渲染到页面中
  35. render(result, btn);
  36. }
  37. </script>
  38. </body>
  39. </html>

[http://help10086.cn/0110/demo6.html]