JSON数据格式

#####基本格式要求

每个JSON对象,就是一个值,每个JSON文档职能包含一个值

  1. 复合类型的值只能是数组或着对象。不能是函数,正则对象或者日期对象
  2. 简单类型的值只有四种:字符串数值(必须以十进制表示)、布尔值null(不能使用NaN, Infinity, -Infinityundefined
  1. 字符串必须使用双引号,不能使用单引号
  2. 对象的键名也必须带有双引号
  3. 数组或着对象的最后一个成员,不能加逗号。

#####JSON.stringify()

JSON.stringify方法用于将一个值转为字符串。该字符串符合 JSON 格式,并且可以被JSON.parse方法还原。

1
2
3
4
5
6
7
8
9
JSON.stringify([1, "false", false])
// '[1,"false",false]'
--------
JSON.stringify({ name: "张三" })
// '{"name":"张三"}'
--------
原始类型的字符串,转换结果会带有双引号,这是因为将来还原的时候,双引号可以让 JavaScript 引擎知道,foo是一个字符串,而不是一个变量名。
JSON.stringify('foo') //""foo""
JSON.stringify('foo')==="\"foo\""

JSON.stringify()还可以接受第二个参数(第二个参数是一个数组[],否则无效)指定需要转成字符串的属性。(只对对象有效,对数组无效)

1
2
3
4
5
6
7
8
9
10
var obj = {
'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3'
};
var selectedProperties = ['prop1', 'prop2'];
JSON.stringify(obj, selectedProperties)
// "{"prop1":"value1","prop2":"value2"}"

转换规则:

  • 如果对象中含有不合规定的值,如undefined 或着函数对象等,会忽略

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var obj = {
    a:1,
    b:2
    }
    JSON.stringify(obj)
    "{"a":1,"b":2}" //会自动在键名上添加括号
    ---------
    var obj = {
    a: undefined,
    b: function () {}
    }
    JSON.stringify(obj) // "{}"
  • 如果是数组中包含有不合规定的值,那么会转为null

    1
    2
    var arr = [undefined, function () {}]
    JSON.stringify(arr) // "[null,null]"
  • JSON.stringify()会忽略对象的不可遍历属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var obj={}
    Object.defineProperties(obj,{
    'foo':{
    value:1,
    enumerable:true enumerable是可枚举属性的开关
    },
    'bar':{
    value:2,
    enumerable:false
    }
    })
    JSON.stringify(obj) //{"foo":1}
    obj.propertyIsEnumerable('foo') //true
    obj.propertyIsEnumerable('bar') //false
    ###关于obj.propertyIsEnumerable(prop)返回一个布尔值,来检测这个属性是否可枚举