【JavaScrpt 漫游】【015】JSON 对象简记

图书馆
文章简介

本文为【JavaScript 漫游】专栏的第 015 篇文章,主要是对 JS 语言中的 JSON 对象的知识点进行了简要记录。

  1. JSON 格式
  2. JSON 对象
  3. JSON.stringify()
  4. JSON.parse()

JSON 格式

JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式,2001年被提出,目的是取代繁琐笨重的 XML 格式。

相比 XML 格式,JSON 格式有两个显著的优点:书写简单,一目了然;符合 JS 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON 迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准。

每个 JSON 对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或更多的值。

JSON 对值的类型和格式有严格的规定。

  1. 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象
  2. 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaNInfinity-Infinityundefined
  3. 字符串必须使用双引号表示,不能使用单引号
  4. 对象的键名必须放在双引号里面
  5. 数组或对象最后一个成员的后面,不能加逗号

要注意的是,null、空数组和空对象都是合法的 JSON 值。

JSON 对象

JSON 对象是 JS 的原生对象,用来处理 JSON 格式数据。它有两个静态方法:JSON.stringify()JSON.parse()

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

JSON.stringify('abc') // ""abc""
JSON.stringify(1) // "1"
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}"
JSON.stringify([1, "false", false])
// '[1,"false",false]'
JSON.stringify({ name: "张三" })
// '{"name":"张三"}'

注意,对于原始类型的字符串,转换结果会带双引号

JSON.stringify('foo') === "foo" // false
JSON.stringify('foo') === "\"foo\"" // true

这是为了将来还原的时候,内层双引号可以让 JS 引擎知道,这是一个字符串,而不是其他类型的值。

JSON.stringify(false) // "false"
JSON.stringify('false') // "\"false\""

如果对象的属性是 undefined、函数或 XML 对象,该属性会被 JSON.stringify 过滤。

var obj = {a: undefined,b: function () {}
};
JSON.stringify(obj) // "{}"

如果数组的成员是undefined、函数或 XML 对象,则这些值被转成 null

var arr = [undefined, function() {}];
JSON.stringify(arr); // "[null, null]"

正则对象会被转为空对象

JSON.stringify(/foo/) // "{}"

JSON.stringify 会忽略对象的不可遍历的属性。

var obj = {};
Object.defineProperties(obj, {'foo': {value: 1,enumerable: true},'bar': {value: 2,enumerable: false}
});
JSON.stringify(obj); // "{"foo":1}"

JSON.stringify 方法还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性。

var obj = {'prop1': 'value1','prop2': 'value2','prop3': 'value3'
};
var selectedProperties = ['prop1', 'prop2'];
JSON.stringify(obj, selectedProperties)
// "{"prop1":"value1","prop2":"value2"}"

这个类似白名单的数组,只对对象的属性有效,对数组无效。

JSON.stringify(['a', 'b'], ['0'])
// "["a","b"]"
JSON.stringify({0: 'a', 1: 'b'}, ['0'])
// "{"0":"a"}"

第二个参数还可以是一个函数,用来更改JSON.stringify的返回值。

function f(key, value) {if (typeof value === "number") {value = 2 * value;}return value;
}
JSON.stringify({ a: 1, b: 2 }, f)
// '{"a": 2,"b": 4}'

JSON.stringify 还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符会添加到每行前面。

JSON.stringify({ p1: 1, p2: 2 }, null, 2);
/*
"{"p1": 1,"p2": 2
}"
*/JSON.stringify({ p1:1, p2:2 }, null, '|-');
/*
"{
|-"p1": 1,
|-"p2": 2
}"
*/

参数对象的 toJSON 方法

如果参数对象有自定义的 toJSON 方法,那么 JSON.stringify 会使用这个方法的返回值作为参数,而忽略原对象的其他属性。

var user = {firstName: '三',lastName: '张',get fullName(){return this.lastName + this.firstName;},toJSON: function () {return {name: this.lastName + this.firstName};}
};JSON.stringify(user)
// "{"name":"张三"}"

JSON.parse()

JSON.parse 方法用于将 JSON 字符串转换成对应的值。

JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // nullvar o = JSON.parse('{"name": "张三"}');
o.name // 张三

如果传入的字符串不是有效的 JSON 格式,JSON.parse 方法将报错。

JSON.parse("'String'") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL

上面代码中,双引号字符串中是一个单引号字符串,因为单引号字符串不符合 JSON 格式,所以报错。

为了处理解析错误,可以将 JSON.parse 方法放在 try...catch 代码块中。

try {JSON.parse("'String'");
} catch(e) {console.log('parsing error');
}

JSON.parse 方法可以接受一个处理函数,作为第二个参数,用法与 JSON.stringify 方法类似。

function f(key, value) {if (key === 'a') {return value + 10;}return value;
}
JSON.parse('{"a": 1, "b": 2}', f)
// {a: 11, b: 2}

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

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

相关文章

【原创 附源码】Flutter安卓及iOS海外登录--Google登录最详细流程

最近接触了几个海外登录的平台,踩了很多坑,也总结了很多东西,决定记录下来给路过的兄弟坐个参考,也留着以后留着回顾。更新时间为2024年2月8日,后续集成方式可能会有变动,所以目前的集成流程仅供参考&#…

Linux第49步_移植ST公司的linux内核第1步_获取linux源码

已知ST公司的linux源码路径: /home/zgq/linux/atk-mp1/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0 1、创建“my_linux”目录 打开第1个终端 输入“ls回车” 输入“cd linux/回车”,切换…

IDEA Ultimate下载(采用JetBrain学生认证)

IDEA Ultimate版本下载 Ulitmate是无限制版(解锁所有插件,正版需要付费。学生可以免费申请许可)Community是开源社区版本(部分插件不提供使用,比如Tomcat插件。免费) 我们将通过学生认证获取免费版。 Je…

例38:使用Frame(分组框)

建立一个EXE工程,在窗体上放两个Frame框。分别放两组单选按钮表示性别和收入,注意每组单选按钮的组名要一样。在按钮中输入代码: Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)If Frame1.Visible ThenFrame1.Visib…

[算法学习] 逆元与欧拉降幂

费马小定理 两个条件: p为质数a与p互质 逆元 如果要求 x^-1 mod p ,用快速幂求 qmi(x,p-2) 就好 欧拉函数 思路:找到因数 i,phi / i * (i-1),除干净,判断最后的n 欧拉降幂 欧拉定理 应用示例 m! 是一个…

【实战】一、Jest 前端自动化测试框架基础入门 —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试?5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

【JVM篇】ThreadLocal中为什么要使用弱引用

文章目录 🍔ThreadLocal中为什么要使用弱引用⭐总结 🍔ThreadLocal中为什么要使用弱引用 ThreadLocal可以在线程中存放线程的本地变量,保证数据的线程安全 ThreadLocal是这样子保存对象的: 在每个线程中,存放了一个…

2024牛客寒假算法基础集训营3

前言 感觉有些题是有难度,但是是我花时间想能想的出来的题目,总体来说做的很爽,题目也不错。个人总结了几个做题技巧,也算是提醒自己。 1.多分类讨论 2.从特殊到一般,便于找规律。例如有一组数,有奇数和…

【嵌入式-定时器】通过呼吸灯案例使用逻辑分析仪分析PWM波形

目的:通过实现呼吸灯分析PWM波形 代码: PWM.c #include "stm32f10x.h" // Device header/*** brief PWM初始化* param 无* retval 无 */ void PWM_Init(void) {// 使能IO和TIM2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM…

错误的集合(力扣刷题)

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 由于作者比较菜,还没学malloc这个函数,因此这个题目只写一些与原题大致的思路。 题目链接:645. 错误的集合 - 力扣…

【Django】Django文件上传

文件上传 1 定义&场景 定义&#xff1a;用户可以通过浏览器将图片等文件上传至网站。 场景&#xff1a; 用户上传头像。 上传流程性的文档[pdf&#xff0c;txt等] 2 上传规范-前端[html] 文件上传必须为POST提交方式 表单 <form> 中文件上传时必须带有 enctype…

创建你的第一个Vue项目(小白专享版本)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

controlnet的模型下载

controlnet模型有sd15和基于sd15上的fp16版本 fp16版本的模型比较小&#xff0c;但功能效果跟sd15是一样的 controlnet的fp16模型下载地址 https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/tree/main controlnet的openpose里&#xff0c;有个dw_open…

Structured Streaming

目录 一、概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;两种处理模型 &#xff08;三&#xff09;Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 &#xff08;一&#xff09;实现步骤 &…

【GAMES101】Lecture 22 物理模拟与仿真

目录 单粒子模拟 显式欧拉方法 改进 中点法/修正的欧拉方法 自适应步长 隐式欧拉方法 非物理改变位置&#xff08;Position-Based / Verlet Integration&#xff09; 刚体模拟 流体模拟 单粒子模拟 先来研究粒子的运动&#xff0c;假设有一个速度矢量场&#xff0c;对…

Java:字符集、IO流 --黑马笔记

一、字符集 1.1 字符集的来历 我们知道计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一个字符进行了编码&#xff08;所谓编码&#xff0c;就是为一个…

(已解决)将overleaf上的文章paper上传到arxiv上遇到的问题。

文章目录 前言初级问题后续问题 前言 首先说一点&#xff0c;将paper的pdf文件直接上传arxiv是不行的&#xff0c;arxiv要求我们要上传源文件&#xff0c;所以才这么麻烦。 初级问题 首先上传文件之后有可能会在下面这个界面出现问题&#xff0c;这里一般都比较常见的问题&a…

Latex排版遇到的常见问题及解决方法

这里写目录标题 1. 图片/ PDF 裁剪1.1 PPT 画图转PDF1.2 PPT裁剪 2. 表格内的文本换行问题2.1 表格跨行显示2.2 表格内文本换行&#xff0c;使用 ‘makecell’ 包 换行2.2 表格内文本添加 圆点 1. 图片/ PDF 裁剪 1.1 PPT 画图转PDF 1.2 PPT裁剪 将输出的PDF文件裁剪成合适尺…

最新酒桌小游戏喝酒小程序源码,带流量主,附带搭建教程

喝酒神器&#xff0c;增加了广告位&#xff0c;根据文档直接替换即可&#xff0c;原版本没有广告位 直接上传源码到开发者端即可 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可 搜索adunit-848e5f13d1ff237a替换为你的Banner 搜索adunit-597…

【Spring学习】Spring Data Redis:RedisTemplate、Repository、Cache注解

1&#xff0c;spring-data-redis官网 1&#xff09;特点 提供了对不同Redis客户端的整合&#xff08;Lettuce和Jedis&#xff09;提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符…