[关闭]
@Dale-Lin 2018-11-02T09:24:02.000000Z 字数 2498 阅读 833

JSON

JavaScript


语法

JSON语法可以表示三种类型的值。

对象的值可以为以上的JSON合法数据类型。

  1. 5
  2. "Hello world!" //JSON中不使用单引号
  3. { //JSON中不使用变量
  4. "name": "Nicholas", //属性名必须加引号
  5. "age": 29
  6. }
  7. [11, "hi", true, {"example": fine}] //数组字面量

JSON 的数组、对象不能有多余的 ,


解析与序列化

JSON对象

ES5定义了全局对象JSON,有两个方法:

  • 非数组对象的属性不能保证序列化后在字符串中的顺序。
  • 布尔值、数字、字符串的包装对象在序列化过程中会转化为对应的原始值。
  • undefined、函数、symbol值在序列化过程中会被忽略(非数组中)或转化成null(数组中)
  • 不可枚举属性会被忽略
  1. JSON.stringify([new Number(1), new String('false'), new Boolean(false)]);
  2. //'[1, "false", false]'
  3. JSON.stringify({[Symbol("foo")]: "foo"};
  4. //'{}'
  5. JSON.stringify(
  6. Object.create(
  7. null,
  8. {
  9. x: {value: 'x', enumerable: false},
  10. y: {value: 'y', enumerable: true}
  11. }
  12. )
  13. );
  14. //'{"y": "y"}'
replacer参数

该参数可以为一个函数或一个数组。

  1. 若为函数,接收两个参数keyvalue,转换属性对应的值。

    • 如返回一个Number,该数字作为相应属性的值加入JSON字符串。
    • 如返回一个String,该字符串作为对应属性的值加入JSON字符串。
    • 如返回一个Boolean,true或false作为相应属性的值加入JSON字符串。
    • 如返回任何对象(非函数),则递归地对它们序列化,即对它们的键值对也调用replacer方法,将结果作为属性的值输出。
    • 如返回undefined,该键值对不会输出。

    返回undefined可以选择性不输出某类数据。

  2. 若为数组,只输出数组中包含的属性(数组中若有原对象中不存在的属性则为undefined,不输出该属性)。


space参数

用来控制结果字符串中的间距。
若为数字,每一级比上一级多缩进该数字值的空格(最多为10);
若为字符串,每一级比上一级多缩进该字符串(或前10个字符)。

如果一个被序列化的对象中有 toJSON 方法,这个方法就会覆盖该对象默认的序列化行为——先调用 toJSON 方法获得返回值,再对该返回值序列化得到结果。

  1. var obj = {
  2. foo: 'foo',
  3. toJSON: function (){
  4. return 'bar';
  5. }
  6. };
  7. JSON.stringify(obj); //'"bar"'
  8. JSON.stringify({x: obj}); //'{"x": "bar"}'


text参数

要被解析成JavaScript值或对象的字符串。

  1. JSON.parse('{}'); //{}
  2. JSON.parse('true'); //true
reviver参数

一个可选函数,规定了原始值再返回前如何被解析构造。调用过程中当前属性的对象作为this,当前属性名和属性值作为参数。若返回undefined则不解析该属性。

会深度优先遍历属性值。
注意最外层的特殊性!

  1. JSON.parse('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}', function(k, v){
  2. console.log(k);
  3. return v; //直接返回原值,相当于没有转换
  4. })
  5. //1
  6. //2
  7. //4
  8. //6
  9. //5
  10. //3
  11. //''
  12. //这里的空字符串是解析到最外层时的k值!对应的v值为转换后的解析值!
  13. //{1: 1, 2: 2, 3: {4: 4, 5: {6: 6}}}

可以添加 if(k === "") return v; 使到了顶层直接返回。

从服务器获取 JSON 数据

利用 ajax 获取服务器上的 JSON 数据:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <h2>使用 XMLHttpRequest 来获取文件内容</h2>
  9. <p>文件内容是标准的 JSON 格式,可以使用 JSON.parse 方法将其转换为 JavaScript 对象。</p>
  10. <p id="demo"></p>
  11. <script>
  12. var xmlhttp = new XMLHttpRequest();
  13. xmlhttp.onreadystatechange = function() {
  14. if (this.readyState == 4 && this.status == 200) {
  15. myObj = JSON.parse(this.responseText);
  16. document.getElementById("demo").innerHTML = myObj.name;
  17. }
  18. };
  19. xmlhttp.open("GET", "/try/ajax/json_demo.txt", true);
  20. xmlhttp.send();
  21. </script>
  22. <p>查看 JSON 文件数据 <a href="/try/ajax/json_demo.txt" target="_blank">json_demo.txt</a></p>
  23. </body>
  24. </html>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注