你真的了解JSON吗?JSON和toJSON该如何转换使用?-JS系列

952 阅读3分钟

本文已参加 [新人创作礼] 活动,一起开启掘金创作之路。

JSON对象

首先我们应该知道JSON是一种文本协议,全局作用域下JSON,名为JSON,是Object对象。

一. 基本信息

  1. JSON格式

    • JSON是一种轻量级的、基于文本的、与语言无关的语法,用于定于数据交换格式
    • 来源于ECMAScript编程语言,但是独立于编程语言
  2. 对象字面量

    • 是创建对象的一种快捷方式,英文名:object literal
    • 对应还有:函数字面量,数组字面量等额定
    • 字面量的性能优于使用new创建
  3. JSON特征

    • JSON就是一串字符串,使用特定的符号标注
    • {} 双括号表示对象
    • [] 中括号表示数组
    • ""双引号内是属性键或值
  4. JSON键

    • 只能是字符串
    • 必须双引号包裹
  5. JSON值

    • object

    • array

    • number

    • string

    • true

    • false

    • null

二. JSON.parse()

  • 作用:将数据转换为 JavaScript 对象
  • 语法:JSON.parse(text[, reviver])

参数说明:

  • text: 必需, 一个有效的 JSON 字符串。
  • reviver:  可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

注意点:

  • 遍历顺序: image.png
  • this指向: 指向当前上文最近对象

三. JSON.stringify()

  • 作用:将 JavaScript 值转换为 JSON 字符串
  • 语法:JSON.stringify(value[, replacer[, space]])

参数说明:

  • value:

    必需, 要转换的 JavaScript 值(通常为对象或数组)。

  • replacer:

    可选。过滤属性或者处理值。

    • 如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。

    • 如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。

    • 如果该参数为null或者未提供,则对象所有的属性都会被序列化。

  • space:

    可选,文本添加缩进、空格和换行符。

    • 如果参数是个数组,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;
    • 如果该参数为字符串:(当字符串长度超过10个字母,取其前10个字母),该字符串将被作为空格;
    • 如果该参数没有提供:(或者为null),将没有空格。

规则:undefined、任意的函数、symbol

  • 作为对象属性值,自动忽略。
  • 作为数组,序列化返回null
  • 单独序列化时,返回undefined

其他规则

  • Date 返回ISO字符串
  • 循环引用报错
  • NaN,Infinity,null 都会作为null
  • BigInt报错
  • Map/Set/WeakMap等对象,仅序列化可枚举属性

四. JSON.toJSON()

  • 作用:如果对象拥有toJSON方法,toJSON会覆盖对象默认的序列化行为
var product = {
    "name": "牙膏",
    "count": 10, 
    "orderDetail": {
        "createTime": 1632996519781,
        "orderId": 8632996519781
    },
    toJSON(){
        return {
           name: "牙膏"
        }
    }
}

console.log(JSON.stringify(product)) // '{"name":"牙膏"}