【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,一经查实,立即删除!

相关文章

4.5 Binance_interface APP 币本位合约交易-基础订单

Binance_interface APP 币本位合约交易-基础订单 Github地址PyTed量化交易研究院 量化交易研究群(VX) py_ted目录 Binance_interface APP 币本位合约交易-基础订单1. APP 币本位合约交易-基础订单函数总览2. 模型实例化3. 下单(API原始接口) set_orde…

【原创 附源码】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/回车”,切换…

字符串的解码--leetcode 394

参考题目如下: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目: 给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复…

iOS swift XHToast.showCenterWithText不显示

extension UIWindow {fileprivate class func window() -> UIWindow{ // let window UIApplication.shared.windows.last! 这是原来的代码let window UIApplication.shared.keyWindow! //这是修改后的代码(亲测有效,可以正常显示&#xff0…

Atcoder ABC339 A-D题解

除夕晚上的比赛&#xff0c;傻子才打。 Problem A: 简单题。但是相比于之前的A题来说还是变难了。直接上代码: #include <bits/stdc.h> using namespace std; int main(){string str;cin>>str;int pos-1;for(int i1;i<str.size();i){if(str[i].)posi;}cout&l…

使用阿里云通义千问14B(Qianwen-14B)模型自建问答系统

使用阿里云通义千问14B&#xff08;Qianwen-14B&#xff09;模型自建问答系统时&#xff0c;调度服务器资源的详情将取决于以下关键因素&#xff1a; 模型部署&#xff1a; GPU资源&#xff1a;由于Qianwen-14B是一个大规模语言模型&#xff0c;推理时需要高性能的GPU支持。模型…

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

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

例38:使用Frame(分组框)

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

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

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

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

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

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

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

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

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

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

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

基于python和matlab的复杂函数拟合的方法、工具以及学习资料

复杂函数拟合是指对具有复杂形式的函数进行拟合,例如积分函数、微分方程、偏微分函数、隐函数、方程组的拟合,通常涉及到非线性、多变量、高维度、高阶、多参数等情况。在实际应用中,复杂函数拟合常常需要结合不同的拟合方法和工具来实现。下面我们将列举常见的复杂函数拟合…

错误的集合(力扣刷题)

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

【Django】Django文件上传

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

Java中==和equals的区别

在Java中&#xff0c;运算符和equals()方法是用于比较对象的两种不同方式&#xff0c;它们有不同的作用和用法&#xff1a; 1、 运算符 运算符用于比较两个对象的引用是否指向同一个内存地址&#xff0c;即它们是否是同一个对象的引用。如果两个引用指向相同的对象&#xff0c…

2024年华为OD机试真题-内存冷热标记-Java-OD统一考试(C卷)

题目描述: 现代计算机系统中通常存在多级的存储设备,针对海量workload的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。 一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,则认为是热内存页,否…

day38 面向对象编程、构造函数等(纯概念)

目录 深入对象构造函数实例成员静态成员内置构造函数ObjectArray包装类型StringNumber 深入对象 了解面向对象的基础概念&#xff0c;能够利用构造函数创建对象。 构造函数 构造函数是专门用于创建对象的函数&#xff0c;如果一个函数使用 new 关键字调用&#xff0c;那么这…