JavaScript中的 JSON方法

    技术2024-10-15  2

    JSON方法可以将对象转换为字符串,并包含重要的属性

    JSON.stringify

    接收对象并将其转换为字符串 let user = { name: "John", age: 30, courese : ["JS","JSON","HTML"], off : false, wife : null }; let json = JSON.stringify(user) console.log(json) //{"name":"John","age":30,"courese":["JS","JSON","HTML"],"off":false,"wife":null}

    得到的 json 字符串是一个被称为 JSON 编码 或 **序列化 **或 字符串化 或 编组化(marshalled) 的对象

    JSON 编码的对象与对象字面量的区别

    字符串使用双引号。JSON 中没有单引号或反引号。所以 'John' 被转换为 "John"。对象属性名称也是双引号的。这是强制性的。所以 age:30 被转换成 "age":30。

    JSON.stringify也可以用于原始的数据类型

    //数字在 JSON 还是数字 console.log(JSON.stringify(1)) //1 //字符串在 JSON 中还是字符串,只是被双引号扩起来 console.log(JSON.stringify('test')) //"test" console.log(JSON.stringify(true)) //true console.log(JSON.stringify([1,2,3])) //[1,2,3]

    一些特定的JavaScript对象属性会被JSON.stringify忽略

    函数属性(方法)。Symbol 类型的属性。存储 undefined 的属性。 let user = { sayHi() { // 被忽略 alert("Hello"); }, [Symbol("id")]: 123, // 被忽略 something: undefined // 被忽略 }; console.log( JSON.stringify(user) ); // {}(空对象)

    不能有循环引用

    let room = { number: 23 }; let meetup = { title: "Group", participants: ["john", "july"] }; meetup.place = room; // meetup 引用了 room room.Group = meetup; // room 引用了 meetup JSON.stringify(meetup); // Error: Converting circular structure to JSON

    排除和转换:replacer

    JSON.stringify 的完整语法是:

    let json = JSON.stringify(value[, replacer, space])

    value:要编码的值

    replacer:要编码的属性数组或者映射函数

    space:用于格式化的空格数量

    第二个参数的作用是帮助我们微调替换,比如要过滤掉循环引用,就可以使用到第二个参数

    我们传递一个属性数组,那么只有这些属性会被编码

    let room = { number: 23 }; let meetup = { title: "Conference", participants: [{name: "John"}, {name: "Alice"}], place: room // meetup 引用了 room }; room.occupiedBy = meetup; // room 引用了 meetup console.log( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) ); /* { "title":"Conference", "participants":[{"name":"John"},{"name":"Alice"}], "place":{"number":23} } */

    除 occupiedBy 以外的所有内容都被序列化了。但是属性的列表有点过长

    可以使用一个函数代替数组作为replacer

    et room = { number: 23 }; let meetup = { title: "Conference", participants: [{name: "John"}, {name: "Alice"}], place: room // meetup 引用了 room }; room.occupiedBy = meetup; // room 引用了 meetup alert( JSON.stringify(meetup, function replacer(key, value) { alert(`${key}: ${value}`); return (key == 'occupiedBy') ? undefined : value; }));

    格式化:space

    JSON.stringify的第三个参数是优化格式的空格数量

    let user = { name: "John", age: 25, roles: { isAdmin: false, isEditor: true } }; alert(JSON.stringify(user, null, 2)); /* 两个空格的缩进: { "name": "John", "age": 25, "roles": { "isAdmin": false, "isEditor": true } } */

    space = 2 的作用是告诉JavaScript在多行中显示嵌套的对象,对象内部缩进2个空格

    自定义 “toJSON”

    对象可以提供 toJSON 方法来进行 JSON 转换,JSON.stringify 会自动调用它。

    let room = { number: 23, toJSON() { return this.number; } }; let meetup = { title: "Conference", room }; alert( JSON.stringify(room) ); // 23 alert( JSON.stringify(meetup) ); /* { "title":"Conference", "room": 23 } */

    toJSON 可用于直接调用 JSON.stringify(room),也可以当作room嵌套在另一个编码对象中

    JSON.parse

    用来对JSON字符串进行解码

    let value = JSON.parse(str, [reviver]);

    str:要解析的 JSON 字符串

    reviver:可选函数,该函数将为每个 (key, value) 对调用,并可以对值进行转换。

    // 字符串化数组 let numbers = "[0, 1, 2, 3]"; numbers = JSON.parse(numbers); console.log( numbers[1] ); // 1

    嵌套对象

    let userData = '{ "name": "John", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }'; let user = JSON.parse(userData); alert( user.friends[1] ); // 1

    JSON 不支持注释。向 JSON 添加注释无效。

    总结

    JSON 是一种数据格式,具有自己的独立标准和大多数编程语言的库。JSON 支持 object,array,string,number,boolean和 null。JavaScript 提供序列化(serialize)成 JSON 的方法 JSON.stringify 和解析 JSON 的方法 JSON.parse这两种方法都支持用于智能读/写的转换函数。如果一个对象具有 toJSON,那么它会被 JSON.stringify 调用。
    Processed: 0.037, SQL: 9