JSON

166 阅读3分钟

JSON是一种轻量级的数据交换格式

JSON.stringIfy()方法

  • 作用:将js对象转换成字符串
var book={
    title:"Professional JavaScript",
    authors:["Nicholas C. Zakas"],
    edition:3,
    year:2011
}   
// JSON.stringify()将普通的对象转换成json格式
console.log(JSON.stringify(book) )//{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,"year":2011}
// Json.parse()将json格式的数据转换成普通对象

JSON.stringify(value,array),value是将要序列化成一个JSON字符串的值,array是数组,数组中的元素与将序列化的对象中属性是对应的,因此在返回的字符串中,就只会包含这两个属性

var book={
    title:"Professional JavaScript",
    authors:["Nicholas C. Zakas"],
    edition:3,
    year:2011
}   
console.log(JSON.stringify(book,["title","edition"]))//{"title":"Professional JavaScript","edition":3}

JSON.stringify(value,function(key,value)),value是将要序列化成一个JSON字符串的值,function可以接收俩个参数属性名和属性值,根据属性名可以知道应该如何处理要序列化的对象的属性,属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串,如果函数返回了undefined,那么相应的属性会被忽略。

var book={
    "title":"Professional JavaScript",
    "authors":["Nicholas C. Zakas"],
    edition:3,
    year:2011
}
var jsonText=JSON.stringify(book,function(key,value){
    switch(key){
        case "authors":
            return value.join(",")
        case "year":
            return 5000
        case "edition":
            return undefined
        default:
            return value
    }
})
console.log(jsonText)//{"title":"Professional JavaScript","authors":"Nicholas C. Zakas","year":5000}

JSON.stringify(value,null,num)num用于控制结果中的缩进和空白符。如果这个参数是一份数值,那他表示的是每个级别缩进的空格数,num的最大值为10,超过10后默认为10

var book2={
    "title":"Professional JavaScript",
    "authors":["Nicholas C. Zakas"],
    edition:3,
    year:2011
}
console.log(JSON.stringify(book2,null,10))

toJSON()方法

有时候JSON.stringify()无法满足对某些对象进行自定义序列化要求,在这些情况下,可以给对象定义toJSON方法,返回其自身的JSON数据格式。

var book={
    "title":"Professional JavaScript",
    "authors":["Nicholas C. Zakas"],
    edition:3,
    year:2011,
    toJSON:function(){
        return this.title
    }
}
console.log(JSON.stringify(book))//"Professional JavaScript"

把一个对象传入JSON.stringify(),序列化该对象的方法顺序:

  • (1)如果存在toJSON()方法而且通过它取得有效的值,则调用该方法,否则,返回对象本身
  • (2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值
  • (3)对第(2)步返回的每个值进行相应的序列化
  • (4)如果提供了第三个参数,执行相应的格式化

JSON.parse()方法

  • 作用:将json格式的数据转换成普通对象
var book={
    title:"Professional JavaScript",
    authors:["Nicholas C. Zakas"],
    edition:3,
    year:2011
}   
// Json.parse()将json格式的数据转换成普通对象
console.log(JSON.parse(JSON.stringify(book)))//{title: "Professional JavaScript", authors: Array(1), edition: 3, year: 2011}

JSON.parse()第二个参数:函数,将在每个键值对儿上调用。为了区别JSON.stringify()接收的替换(过滤)函数,这个函数被称为函数,但实际上这两个函数的签名是相同的--他们都接收两个参数,一个键和一个值,而且都需要返回一个值。如果还原函数返回undefined,则表示要从结果中删除相应的键,如果返回其他值,则将该值插入到结果中。在将日期字符串换为Date对象时,经常会用到还原函数

var book={
    "title":"Professional JavaScript",
    "authors":["Nicholas C. Zakas"],
    edition:3,
    year:2011,
    releaseDate:new Date(2019,09,15)
}
var jsonText=JSON.stringify(book)
var bookCopy=JSON.parse(jsonText,function(key,value){
    if(key=="releaseDate"){
        return new Date(value)
    }else{
        return value
    }
})
console.log(bookCopy.releaseDate.getFullYear())//2019