JSON 方法

JSON 方法

    • JSON 数据格式规范
    • JSON.stringify
      • 使用 replacer
      • 格式化:space
      • 自定义 `toJSON`
    • JSON.parse
      • 使用 reviver
    • 手写一个简易的 JSON.stringify
    • eval 实现 JSON.parse
    • 总结
    • 参考

JSON(JavaScript Object Notation)是表示值和对象的通用格式,是一种轻量级的数据交换格式。在 JavaScript 中,有个名为 JSON 的全局对象用来处理 JSON 数据,其中有两个方法:

  • JSON.stringify():将对象转换为 JSON 字符串
  • JSON.parse():将 JSON 字符串转换为对象

JSON 数据格式规范

  • JSON 中没有单引号,反引号和注释。
  • 对象的属性名必须带有双引号。

JSON.stringify

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

  • value:要编码的值。
  • replacer:要编码的属性数组或映射函数 function(key, value)。
  • space:用于格式化的空格数量。

JSON.stringify 支持以下数据类型:

  • Objects { ... }
  • Arrays [ ... ]
  • Primitives:
    • strings,
    • numbers,
    • boolean values true/false
    • null
// 数字在 JSON 还是数字
alert(JSON.stringify(1)) // 1// 字符串在 JSON 中还是字符串,只是被双引号扩起来
alert(JSON.stringify('test')) // "test"alert(JSON.stringify(true)) // truealert(JSON.stringify([1, 2, 3])) // [1,2,3]

JSON 是语言无关的纯数据规范,因此一些特定于 JavaScript 的对象属性会被 JSON.stringify 跳过:

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

使用 replacer

如果对象循环引用或者我们不想编码某些属性怎么办?这时候可以用到第二个参数 replacer

replacer 如果是数组,则仅有数组中的属性被编码。

const father = {name: 'father',
}const son = {name: 'son',father,
}father.son = son// JSON.stringify(father) // TypeError: Converting circular structure to JSON
JSON.stringify(father, ['name', 'son']) // '{"name":"father","son":{"name":"son"}}'

replacer 如果是函数,则会获取每个键/值对,包括嵌套对象和数组项,然后自行控制该替换的值。

const father = {name: 'father',
}const son = {name: 'son',father,
}father.son = sonJSON.stringify(father, (key, value) => {if (key === 'father') {return undefined}return value
}) // '{"name":"father","son":{"name":"son"}}'

replacer 普通函数(非箭头函数)中的 this 的值是包含当前属性的对象。

const obj = {a: 1,b: {c: 2,},
}JSON.stringify(obj, function (key, value) {console.log(this[key] === value) // truereturn value
})

格式化:space

JSON.stringify(value, replacer, spaces) 的第三个参数是用于优化格式的空格数量,一般用于调试时输出更美观的 JSON 字符串。

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}
}
*/

自定义 toJSON

toString 进行字符串转换,对象也可以提供 toJSON 方法来进行 JSON 转换。如果可用,JSON.stringify 会自动调用它。

const obj = {a: 1,toJSON() {return 'Hello'},
}JSON.stringify(obj) // "Hello"

JSON.parse

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

  • str:要解析的 JSON 字符串。
  • reviver:可选的函数 function(key,value),该函数将为每个 (key, value) 对调用,并可以对值进行转换。
// 字符串化数组
let numbers = '[0, 1, 2, 3]'numbers = JSON.parse(numbers)alert(numbers[1]) // 1

使用 reviver

当我们想要对解析出的值进行转换时,可以使用第二个参数 reviver

const str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}'const meetup = JSON.parse(str, function (key, value) {if (key === 'date') return new Date(value)return value
})meetup.date.getDate() // 30

手写一个简易的 JSON.stringify

function myJsonStringify(obj) {const type = typeof objif (type === 'undefined' || type === 'symbol' || type === "function") returnif (type === 'bigint') {throw new TypeError('Do not know how to serialize a BigInt')}if (type !== 'object') return '' + objif (obj === null) return 'null'if (typeof obj.toJSON === 'function') return myJsonStringify(obj.toJSON())if (obj instanceof Array) {return `[${obj.map((val) => myJsonStringify(val) || null).join(',')}]`}return `{${Object.keys(obj).map((key) => {let val = obj[key]if (['function', 'symbol', 'undefined'].includes(typeof val)) returnreturn `"${key}":${myJsonStringify(val)}`}).filter(Boolean).join(',')}}`
}

eval 实现 JSON.parse

在不支持 JSON 的旧浏览器中,可以考虑使用 eval 来解析 JSON。

let numbers = '[0, 1, 2, 3]'function parseJson(str) {return eval(`(${str})`)
}numbers = parseJson(numbers) // [0, 1, 2, 3]

需要在 json 字符串前后加上括号,否则 {...} 会被当作代码块而不是对象。

总结

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

参考

  • 现代 JavaScript 教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/659519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

N65总账凭证管理凭证查询(sql)

--核算账簿 select code , name , pk_setofbook from org_setofbook where ( pk_setofbook in ( select pk_setofbook from org_accountingbook where 1 1 and ( pk_group N0001A11000000000037X ) and ( accountenablestate 2 ) ) ) order by code;--核算账簿 select code …

AI在数模中的应用(附2024年美赛AI规则解读)

近期一直有人私信询问AI对数模的应用。本次想借着2024年美赛对AI工具的使用说明已经去年国赛开会的结果,跟大家分享一下国赛、美赛对于AI的态度以及如何使用AI应用于数模。本文将基于本人常用的三种AI工具(ChatGPT、文心一言、NEW bing)进行讲解 根据2023年国赛总结…

armbian docker 部署 homeassistant 忘记密码重置密码

docker run -d \ --name homeassistant \ --privileged \ --restartunless-stopped \ -e TZMY_TIME_ZONE \ -v /etc/docker/ha:/config \ -v /run/dbus:/run/dbus:ro \ -p 8123:8123 \ ghcr.io/home-assistant/home-assistant:stable重置用户的密码,通过容器命令行 …

数据库技术栈 —— B树与B+树

数据库技术栈 —— B树与B树 一、复习二、MySQL中的B树应用 一、复习 B树是多路平衡查找树的意思 参考文章或视频链接[1] 【王道计算机考研 数据结构】 二、MySQL中的B树应用 这篇文章里的计算题还是讲的不错的。 参考文章或视频链接[1] 《探究MySQL的索引结构选型》

【Python】深度解读Python参数

目录 Python参数种类 Python参数定义 不定参数接收 限定传入参数方式 具体示例 位置参数示例 关键词参数示例 两种方法都支持的形式 参数默认值(可选参数) 参数默认值定义 引用类型默认值异常行为 参数类型声明 参数类型定义申明 函数返回值…

阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势

作者:张铭辉、泮圣伟 前言 随着春节大促即将到来,为了确保线上业务高效稳定地运行,电商企业大多会对旗下关键业务应用进行多轮测试。通过模拟线上较高流量的请求,来观察服务性能的实际表现。以某企业的业务测试报告举例&#xf…

SpringClound项目相关

nacos本机模式非虚拟机启动也可正常连接 nacos中的配置中心相当于在application.yml中的相关配置,转移位置,内容同application.yml完全一样均可。 黑马项目导入后,依赖缺失: 首先尝试maven重新加载,控制台提示传递依…

稀疏场景高性能训练方案演变|京东广告算法架构体系最佳实践

近年来,推荐场域为提升模型的表达能力和计算能力,模型规模和计算复杂度大幅增加,同时,高规格硬件资源为模型迭代、算法优化带来了更大的机遇和挑战。为了应对模型规模和算力升级带来的存储、IO和计算挑战,京东零售广告…

解决WindowServer2022关于EDGE浏览器识自签证书问题

1、证书颁发机构服务打开MMC控制台 添加证书、证书模板 2、复制证书模板

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Gauge组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Gauge组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Gauge组件 数据量规图表组件,用于将数据展示为环形图表。 子组件 无…

Unity_Visual Effect Graph

Unity_Visual Effect Graph Unity可视化特效渲染虽不及Unreal Engine,然也还是吊打一众其他引擎的,粗浅整理一波吧,需要深入研究的点实在是太多了。 按照常规包管理方式安装Visual Effect Graph插件: 安装之后,示例文件夹中自带资源,拖入场景即可: 场景只是资源的显…

SOLIDWORKS Simulation 2024增强新功能

SOLIDWORKS 2024 新功能前瞻| SOLIDWORKS Simulation 功能增强 • 性能增强功能 • 壳体的接合交互 • 网格性能 • 欠约束实体检测 • 增强型轴承接头 • 收敛检查图解 • 去耦合混合自由体模式 • 复制算例时排除网格和结果 • 新增在网格化后及分析完成后自动保存模…

C++语法学习

一、字符串 1.字符与整数的联系--ASCII表 0~9 :48~57 A~Z:65~90 a~z:97~122 字符与数字之间转换: 1.1字符转数字&#xff1a; 字符转数字&#xff1a; char c A;cout << c-A << endl; //输出0cout << (int)c << endl; //输出…

k8s学习-数据管理

在Docker中我们知道&#xff0c;要想实现数据的持久化&#xff08;所谓Docker的数据持久化即数据不随着Container的结束而结束&#xff09;&#xff0c;需要将数据从宿主机挂载到容器中&#xff0c;常用的手段就是Volume数据卷。在K8S中&#xff0c;也提供了存储模型Volume&…

Vue学习笔记14 --自定义hook函数/toRef/provide/inject等

9.自定义hook函数 什么是hook&#xff1f;—— 本质是一个函数&#xff0c;把setup函数中使用的Composition API进行了封装。 类似于vue2.x中的mixin。 自定义hook的优势: 复用代码, 让setup中的逻辑更清楚易懂。 10.toRef 作用&#xff1a;创建一个 ref 对象&#xff0c;其…

编程笔记 html5cssjs 069 JavaScrip Undefined数据类型

编程笔记 html5&css&js 069 JavaScrip Undefined数据类型 一、undefined数据类型二、类型运算小结 在JavaScript中&#xff0c;undefined 是一种基本数据类型&#xff0c;它表示一个变量已经声明但未定义&#xff08;即没有赋值&#xff09;或者一个对象属性不存在。 一…

「HDLBits题解」Build a circuit from a simulation waveform

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Sim/circuit1 - HDLBits module top_module (input a,input b,output q );//assign q a & b ; // Fix meendmodule题目链接&a…

软件压力测试:探究其目的与重要性

随着软件应用在各行各业中的广泛应用&#xff0c;确保软件在高负载和极端条件下的稳定性变得至关重要。软件压力测试是一种验证系统在不同负载条件下的性能和稳定性的方法。本文将介绍软件压力测试的目的以及为什么它对软件开发和部署过程至关重要。 验证系统性能的极限&#x…

防火墙双向NAT配置

目录 拓扑需求 配置配置服务器映射配置NAT策略配置访问外网的NAT 配置安全策略 测试 拓扑 需求 分公司内部的客户端可以通过公网地址访问到内部的服务器 主要配置区域 配置 测试之前记得开启服务器的服务 配置服务器映射 配置NAT策略 源地址和目的地址同时转换 配置访问…

C++文件操作(2)

文件操作&#xff08;2&#xff09; 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件 用二进制方式打开文本存储的文件时&#xff0c;也可以读取其中的内容&#xff0c;因为文本文件…