json 介绍

JavaScript Object Notation ,是一种轻量级的数据交换格式
具有自我描述性且易于理解
通过 JavaScript 对象标记法书写的文本
功能

  • 交换数据

    • 数据在浏览器和服务器之间交换时,只能是文本
    • json 数据文本,并且我们可以把任何 JavaScript 对象转换成 json,然后将 json发送到服务器
    • 也能从服务器接收到的任何 jason 转换成 JavaScript 对象
  • 发送数据

    • JSON.stringify ```javascript <!DOCTYPE html>

把 JavaScript 对象转换为 JSON 字符串,然后发送到服务器。

  1. - 接收数据
  2. - JSON.parse(myJSON)
  3. ```javascript
  4. <!DOCTYPE html>
  5. <html>
  6. <body>
  7. <h1>把 JSON 格式的字符串,转换为 JavaScript 对象:</h1>
  8. <p id="demo"></p>
  9. <script>
  10. var myJSON = '{ "name":"Bill Gates", "age":62, "city":"Seattle" }';
  11. var myObj = JSON.parse(myJSON);
  12. document.getElementById("demo").innerHTML = myObj.name;
  13. </script>
  14. </body>
  15. </html>
  • 存储数据 ```javascript <!DOCTYPE html>

通过 local storage 存储并取回数据:

  1. <a name="jgTap"></a>
  2. # json 语法
  3. - 是 JavaScript 语法的子集
  4. - 必须用双引号
  5. - <br />
  6. - 语法规则
  7. - 数据在名称/值对中
  8. - 数据由逗号分开
  9. - 花括号容纳对象
  10. - 方括号容纳数组
  11. - 在 json的键
  12. - 键必须是字符串,由双引号包围,而 JavaScript 中,键可以是字符串、数字或者标识符名称
  13. - 在 json 中的值,必须是以下数据类型之一
  14. - 字符串
  15. - 数字
  16. - 对象(json 对象)
  17. - 数组
  18. - 布尔
  19. - null
  20. - 而 JavaScript 中:还可以是
  21. - 函数
  22. - 日期
  23. - undefined
  24. ```javascript
  25. <!DOCTYPE html>
  26. <html>
  27. <body>
  28. <h1>使用括号表示法访问 JavaScript 对象:</h1>
  29. <p id="demo"></p>
  30. <script>
  31. var myObj, x;
  32. myObj = { name: "Bill Gates", age: 62, city: "Seattle" };
  33. x = myObj["name"];
  34. document.getElementById("demo").innerHTML = x;
  35. </script>
  36. </body>
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>修改 JavaScript 对象:</h1>
  5. <p id="demo"></p>
  6. <script>
  7. var myObj, x;
  8. myObj = { name: "Bill Gates", age: 62, city: "Seattle" };
  9. myObj.name = "Steve Jobs";
  10. document.getElementById("demo").innerHTML = myObj.name;
  11. </script>
  12. </body>
  13. </html>

JSON与XML

json 实例

  1. {"employees":[
  2. { "firstName":"Bill", "lastName":"Gates" },
  3. { "firstName":"Steve", "lastName":"Jobs" },
  4. { "firstName":"Elon", "lastName":"Musk" }
  5. ]}
  1. <employees>
  2. <employee>
  3. <firstName>Bill</firstName>
  4. <lastName>Gates</lastName>
  5. </employee>
  6. <employee>
  7. <firstName>Steve</firstName>
  8. <lastName>Jobs</lastName>
  9. </employee>
  10. <employee>
  11. <firstName>Elon</firstName>
  12. <lastName>Musk</lastName>
  13. </employee>
  14. </employees>

二者相同

  • 都是自描述(即人类可读)的
  • 都是分级的(值中有值)
  • 都能被大量编程语言解析和使用
  • 都能被 XMLHttpRequest 读取

    二者不同

  • json 不使用标签

  • json 更短
  • json 读写速度更快
  • 可以使用数组
  • json 可以通过标准 JavaScript 函数进行解析,而 XML 必须使用XML 解析式进行解析

json 数据类型

1. 字符串

必须双引号包围

2. 数字

必须是整数或者浮点数

3. json 对象

4. 数组

5. 布尔

6. null

不可以

  • 函数
  • 日期
  • undefined

    json 解析

    通过 JSON.parse()解析数据,会将其转换成 JavaScript 对象
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>用 JSON 字符串创建对象</h1>
  5. <p id="demo"></p>
  6. <script>
  7. var text = '{"employees":[' +
  8. '{"firstName":"Bill","lastName":"Gates" },' +
  9. '{"firstName":"Steve","lastName":"Jobs" },' +
  10. '{"firstName":"Elon","lastName":"Musk" }]}';
  11. obj = JSON.parse(text);
  12. document.getElementById("demo").innerHTML =
  13. obj.employees[1].firstName + " " + obj.employees[1].lastName;
  14. </script>
  15. </body>

解析服务器中的 json——JavaScript 对象

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>使用 XMLHttpRequest 获取文件的内容</h1>
  5. <p>JSON 格式的内容能够轻松转换为 JavaScript 对象。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var xmlhttp = new XMLHttpRequest();
  9. xmlhttp.onreadystatechange = function() {
  10. if (this.readyState == 4 && this.status == 200) {
  11. var myObj = JSON.parse(this.responseText);
  12. document.getElementById("demo").innerHTML = myObj.name;
  13. }
  14. };
  15. xmlhttp.open("GET", "/example/json/json_demo.txt", true);
  16. xmlhttp.send();
  17. </script>
  18. <p>查看 <a href="/exampl

image.png

解析为 JavaScript 数组

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>数组内容</h1>
  5. <p>以 JSON 数组写的内容会被转换为 JavaScript 数组。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var xmlhttp = new XMLHttpRequest();
  9. xmlhttp.onreadystatechange = function() {
  10. if (this.readyState == 4 && this.status == 200) {
  11. var myArr = JSON.parse(this.responseText);
  12. document.getElementById("demo").innerHTML = myArr[0];
  13. }
  14. };
  15. xmlhttp.open("GET", "/demo/json_demo_array.txt", true);
  16. xmlhttp.send();
  17. </script>
  18. <p>查看 <a href="/example/json/json_demo_array.txt" target="_blank">json_demo_array.txt</a></p>

解析日期

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>把字符串转换为 date 对象</h1>
  5. <p id="demo"></p>
  6. <script>
  7. var text = '{"name":"Bill Gates", "birth":"1955-10-28", "city":"Seattle"}';
  8. var obj = JSON.parse(text, function (key, value) {
  9. if (key == "birth") {
  10. return new Date(value);
  11. } else {
  12. return value;
  13. }
  14. });
  15. document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;
  16. </script>
  17. </body>
  18. </html>
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>把字符串转换为函数</h1>
  5. <p id="demo"></p>
  6. <script>
  7. var text = '{"name":"Bill Gates", "age":"function() {return 62;}", "city":"Seattle"}';
  8. var obj = JSON.parse(text);
  9. obj.age = eval("(" + obj.age + ")");
  10. document.getElementById("demo").innerHTML = obj.name + ", " + obj.age();
  11. </script>
  12. </body>
  13. </html>

JSON字符串化

JSON.stringify()将 JavaScript 对象转换成字符串
在向 web 服务器发送数组时,必须是字符串格式。

JavaScript 对象进行字符串化

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>从 JavaScript 对象创建 JSON 字符串</h1>
  5. <p id="demo"></p>
  6. <script>
  7. var obj = { name: "Bill", age: 62, city: "Seatle" };
  8. var myJSON = JSON.stringify(obj);
  9. document.getElementById("demo").innerHTML = myJSON;
  10. </script>
  11. </body>

image.png

JavaScript 数组字符串化

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>用 JavaScript 数组创建 JSON 字符串</h1>
  5. <p id="demo"></p>
  6. <script>
  7. var arr = [ "Bill Gates", "Steve Jobs", "Elon Musk" ];
  8. var myJSON = JSON.stringify(arr);
  9. document.getElementById("demo").innerHTML = myJSON;
  10. </script>
  11. </body>
  12. </html>

image.png

日期字符串化

直接将日期转化为字符串

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON.stringify 会把任何日期对象转换为字符串</h1>
  5. <p id="demo"></p>
  6. <script>
  7. var obj = { name: "Bill Gates", today: new Date(), city: "Seattle" };
  8. var myJSON = JSON.stringify(obj);
  9. document.getElementById("demo").innerHTML = myJSON;
  10. </script>
  11. </body>
  12. </html>

函数字符串化

删除对象中的函数

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON.stringify 会删除对象中的任何函数</h1>
  5. <p id="demo"></p>
  6. <script>
  7. var obj = { name: "Bill Gates", age: function () {return 62;}, city: "Seattle" };
  8. var myJSON = JSON.stringify(obj);
  9. document.getElementById("demo").innerHTML = myJSON;
  10. </script>
  11. </body>
  12. </html>

image.png

json 对象(Python 中字典)

格式

JSON 对象被花括号 {} 包围。
JSON 对象以键/值对书写。
键必须是字符串,值必须是有效的 JSON 数据类型(字符串、数字、对象、数组、布尔或 null)。
键和值由冒号分隔。
每个键/值对由逗号分隔。

访问对象

通过点点或者中括号访问对象

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 对象</h1>
  5. <p>使用点号表示法访问 JSON 对象:</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, x;
  9. myObj = {"name":"Bill Gates", "age":62, "car":null};
  10. x = myObj.name;
  11. document.getElementById("demo").innerHTML = x;
  12. </script>
  13. </body>
  14. </html>

通过中括号

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 对象</h1>
  5. <p>使用括号表示法访问 JSON 对象:</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, x;
  9. myObj = {"name":"Bill Gates", "age":62, "car":null};
  10. x = myObj["name"];
  11. document.getElementById("demo").innerHTML = x;
  12. </script>
  13. </body>

遍历对象

遍历的是 key 值

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 对象</h1>
  5. <p>如何遍历 JSON 对象中的所有属性。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, x;
  9. myObj = {"name":"Bill Gates", "age":62, "car":null};
  10. for (x in myObj) {
  11. document.getElementById("demo").innerHTML += x + "<br>";
  12. }
  13. </script>
  14. </body>
  15. </html>

用中括号遍历属性值

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 对象</h1>
  5. <p>使用括号表示法访问属性值。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, x;
  9. myObj = {"name":"Bill Gates", "age":62, "car":null};
  10. for (x in myObj) {
  11. document.getElementById("demo").innerHTML += myObj[x] + "<br>";
  12. }
  13. </script>
  14. </body>
  15. </html>

嵌套的 json 对象

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 对象</h1>
  5. <p>如何访问嵌套的 JSON 对象。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj = {
  9. "name":"Bill Gates",
  10. "age":62,
  11. "cars": {
  12. "car1":"Porsche",
  13. "car2":"BMW",
  14. "car3":"Volvo"
  15. }
  16. }
  17. document.getElementById("demo").innerHTML += myObj.cars.car2 + "<br>";
  18. //or:
  19. document.getElementById("demo").innerHTML += myObj.cars["car2"];
  20. </script>
  21. </body>
  22. </html>

修改值

通过点点修改

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 对象</h1>
  5. <p>如何修改 JSON 对象中的值。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, i, x = "";
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars": {
  13. "car1":"Porsche",
  14. "car2":"BMW",
  15. "car3":"Volvo"
  16. }
  17. }
  18. myObj.cars.car2 = "Mercedes Benz";
  19. for (i in myObj.cars) {
  20. x += myObj.cars[i] + "<br>";
  21. }
  22. document.getElementById("demo").innerHTML = x;
  23. </script>
  24. </body>
  25. </html>

通过中括号修改

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 对象</h1>
  5. <p>如何使用括号表示法修改 JSON 对象中的值。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, i, x = "";
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars": {
  13. "car1":"Porsche",
  14. "car2":"BMW",
  15. "car3":"Volvo"
  16. }
  17. }
  18. myObj.cars["car2"] = "Mercedes Benz";
  19. for (i in myObj.cars) {
  20. x += myObj.cars[i] + "<br>";
  21. }
  22. document.getElementById("demo").innerHTML = x;
  23. </script>
  24. </body>
  25. </html>

删除对象属性

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 对象</h1>
  5. <p>如何删除 JSON 对象的属性。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, i, x = "";
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars": {
  13. "car1":"Porsche",
  14. "car2":"BMW",
  15. "car3":"Volvo"
  16. }
  17. }
  18. delete myObj.cars.car3;
  19. for (i in myObj.cars) {
  20. x += myObj.cars[i] + "<br>";
  21. }
  22. document.getElementById("demo").innerHTML = x;
  23. </script>
  24. </body>
  25. </html>

json 数组(类似于 Python 中列表)

格式

可以是:字符串、数字、对象、数组、布尔值、null
不可以:函数、日期、undefined

访问数组值

x = myObj.cars[0]

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 数组</h1>
  5. <p>访问 JSON 对象的数组值。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, x;
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars":[ "Porsche", "BMW", "Volvo" ]
  13. };
  14. x = myObj.cars[0];
  15. document.getElementById("demo").innerHTML = x;
  16. </script>
  17. </body>
  18. </html>

遍历数组值

for (i in myObj.cars)

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 数组</h1>
  5. <p>使用 for in 循环遍历数组</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, i, x = "";
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars":[ "Porsche", "BMW", "Volvo" ]
  13. };
  14. for (i in myObj.cars) {
  15. x += myObj.cars[i] + "<br>";
  16. }
  17. document.getElementById("demo").innerHTML = x;
  18. </script>
  19. </body>
  20. </html>

for (i = 0; i < myObj.cars.length; i++)

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 数组</h1>
  5. <p>使用 for 循环遍历数组</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, i, x = "";
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars":[ "Porsche", "BMW", "Volvo" ]
  13. };
  14. for (i = 0; i < myObj.cars.length; i++) {
  15. x += myObj.cars[i] + "<br>";
  16. }
  17. document.getElementById("demo").innerHTML = x;
  18. </script>
  19. </body>
  20. </html>

数组嵌套数据

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 数组</h1>
  5. <p>遍历数组内的数组。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, i, j, x = "";
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars": [
  13. {"name":"Porsche", "models":["911", "Taycan"]},
  14. {"name":"BMW", "models":["M5", "M3", "X5"]},
  15. {"name":"Volvo", "models":["XC90", "V60"] }
  16. ]
  17. }
  18. for (i in myObj.cars) {
  19. x += "<h2>" + myObj.cars[i].name + "</h2>";
  20. for (j in myObj.cars[i].models) {
  21. x += myObj.cars[i].models[j] + "<br>";
  22. }
  23. }
  24. document.getElementById("demo").innerHTML = x;
  25. </script>
  26. </body>
  27. </html>

修改和删除数组值

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 数组</h1>
  5. <p>如何修改 JSON 对象的数组值。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, i, x = "";
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars": ["Porsche","BMW","Volvo"]
  13. }
  14. myObj.cars[2] = "Mercedes Benz";
  15. for (i in myObj.cars) {
  16. x += myObj.cars[i] + "<br>";
  17. }
  18. document.getElementById("demo").innerHTML = x;
  19. </script>
  20. </body>
  21. </html>

delete myObj.cars[2];

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JSON 数组</h1>
  5. <p>如何删除数组的属性。</p>
  6. <p id="demo"></p>
  7. <script>
  8. var myObj, i, x = "";
  9. myObj = {
  10. "name":"Bill Gates",
  11. "age":62,
  12. "cars": ["Porsche","BMW","Volvo"]
  13. }
  14. delete myObj.cars[2];
  15. for (i in myObj.cars) {
  16. x += myObj.cars[i] + "<br>";
  17. }
  18. document.getElementById("demo").innerHTML = x;
  19. </script>
  20. </body>
  21. </html>