(77)Wangdao.com第十五天_JavaScript 用于数据交换的文本格式 JSON 对象
JSON 对象
JSON (JavaScript Object Notation 的缩写)
也是一种数据,是 JavaScript 的原生对象,用来处理 JSON 格式数据。它有两个静态方法:JSON.stringify()
和 JSON.parse()
是一种无序的属性名和属性值的集合,用于网站的前后台交互。
- 在前后台交互的时候,虽然数据的格式是 json,但要用字符串的形式进行传递
- 发送时,使用 JSON.stringify( json对象 ) 将 json 对象转换成字符串。
- 接收时,用 JSON.parse(字符串形式的 json ) 解析成 json 对象。
var p = {
name: '周杰伦',
age: 40
}; var jsonObj = {
"name":"陶喆",
"age":"45",
"gender":"true",
};
// 发送
var jsonStr = JSON.stringify(jsonObj); // // 接收
var jsonObj = JSON.parse(jsonStr); // // for...in...遍历 json对象
for var k in jsonObj{
console
} - JSON 格式是用于数据交换的文本格式
- 2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。
- JSON 迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准。
- 目的是取代繁琐笨重的 XML 格式。
- 两个显著的优点:
- 书写简单,一目了然;
- 符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。
- 每个 JSON 对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或更多的值。
- JSON 对值的类型和格式有严格的规定
- 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象
- 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)
- 字符串必须使用双引号表示,不能使用单引号
- 对象的键名必须放在双引号里面
- 数组或对象最后一个成员的后面,不能加逗号
- JSON.stringify()
- 第一个参数为JSON对象,将转为 ' JSON 字符串' 。该字符串符合 JSON 格式,并且可以被
JSON.parse
方法还原 - 第一个参数如果是原始类型的字符串,结果会带双引号,转换为 "JSON字符串"。
- 这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值
JSON.stringify('foo') === "foo" // false
JSON.stringify('foo') === "\"foo\"" // true
//字符串foo,被转成了"\"foo"\"。
// 这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值 JSON.stringify(false); // "false"
// 由于没有内层双引号,所以原始值是布尔,而不是字符串 JSON.stringify('false'); // "\"false\""
- 这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值
- 如果对象的属性值是
undefined
、函数或 XML 对象,该属性会被JSON.stringify
过滤 - 如果数组的成员是
undefined
、函数或 XML 对象,则这些值被转成null
- 正则对象会被转成空对象 JSON.stringify(/foo/) // "{}"
- 会忽略对象的不可遍历的属性
var obj = {};
Object.defineProperties(obj, {
'foo': {
value: 1,
enumerable: true
},
'bar': {
value: 2,
enumerable: false
}
}); JSON.stringify(obj); // "{"foo":1}"
- 还可以接受接受一个数组,作为第二个参数,指定需要转成字符串的属性。。。只对对象的属性有效,对数组无效
- 指定要解析的属性
var obj = {
'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3'
}; var selectedProperties = ['prop1', 'prop2']; JSON.stringify(obj, selectedProperties); //{"prop1":"value1","prop2":"value2"}"
- 指定要解析的属性
- 第二个参数还可以是一个函数,用来更改
JSON.stringify
的返回值 - 函数,接受两个参数,分别是被转换的对象的键名和键值
- 递归处理所有的键。每次递归处理前一次修改后的对象
- 如果处理函数返回
undefined
或没有返回值,则该属性会被忽略o
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 字符串的可读性。
- 如果是数字,表示每个属性前面添加的空格(最多不超过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
}"
*/
- 第一个参数,即JSON对象,如果含有 toJSON() 方法,则直接使用这个方法的返回值作为参数,而忽略原对象的其他参数
- Date 就拥有自己的 toJSON() 方法
toJSON
方法的一个应用是,将正则对象自动转为字符串。JSON.stringify
默认不能转换正则对象,但是设置了toJSON
方法以后,就可以转换正则对象了var obj = {
reg: /foo/
}; // 不设置 toJSON 方法时
JSON.stringify(obj) // "{"reg":{}}" // 设置 toJSON 方法时
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/) // ""/foo/""
- 会忽略对象的不可遍历的属性
- JSON.parse()
- 用于将 JSON 字符串转换成对应的值
- 如果传入的字符串不是有效的 JSON 格式,
JSON.parse
方法将报错 - 为了处理解析错误,可以将
JSON.parse
方法放在try...catch
代码块中try {
JSON.parse("'String'");
} catch(e) {
console.log('parsing error');
}
- 可以接受一个处理函数,作为第二个参数,用法与
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}
(77)Wangdao.com第十五天_JavaScript 用于数据交换的文本格式 JSON 对象的更多相关文章
- (78)Wangdao.com第十五天_JavaScript 面向对象
面向对象编程(Object Oriented Programming,缩写为 OOP) 是目前主流的编程范式. 是单个实物的抽象, 是一个容器,封装了属性(property)和方法(method),属 ...
- (79)Wangdao.com第十五天_JavaScript 对象的继承_prototype原型对象_封装_函数式编程
javascript 内置了许多 function 函数(){...} js 执行首先就会执行自己内置的函数定义 (function Function.function Object) 对象的继承 大 ...
- (76)Wangdao.com第十四天_JavaScript 正则表达式对象 RegExp
RegExp Regular Expression,正则表达式是一种表达 文本模式(字符串结构) 的式子. 常常用来按照“给定模式”匹配文本.比如,正则表达式给出一个 Email 地址的模式, ...
- (92)Wangdao.com_第二十五天_线程机制_H5 Web Workers 分线程任务_事件 Event
浏览器内核 支撑浏览器运行的最核心的程序 IE 浏览器内核 Trident内核,也是俗称的IE内核Chrome 浏览器内核 统称为 Chromium 内核或 ...
- NLP(十五)让模型来告诉你文本中的时间
背景介绍 在文章NLP入门(十一)从文本中提取时间 中,笔者演示了如何利用分词.词性标注的方法从文本中获取时间.当时的想法比较简单快捷,只是利用了词性标注这个功能而已,因此,在某些地方,时间的识别 ...
- SpringMVC(十五) RequestMapping map模型数据
控制器中使用map模型数据,传送数据给视图. 控制器参考代码: package com.tiekui.springmvc.handlers; import java.util.Arrays; impo ...
- R in action读书笔记(20)第十五章 处理缺失数据的高级方法
处理缺失数据的高级方法 15.1 处理缺失值的步骤 一个完整的处理方法通常包含以下几个步骤: (1) 识别缺失数据: (2) 检查导致数据缺失的原因: (3) 删除包含缺失值的实例或用合理的数值代替( ...
- 测开之路一百五十五:jquery-validation前台数据验证
前面做的wtform验证是服务器端的验证,需要把数据传输到服务器,服务器验证后再吧结果传输到前端,网络慢的时候,用户体验不好,所以需要前端验证,且后端验证不能少 传统的js或者jquery如果要验证信 ...
- Java开发学习(二十五)----使用PostMan完成不同类型参数传递
一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...
随机推荐
- C# 另一种提交表单
一般提交表单的方式就是:Get,Post 以及关联action 今天看了一种方式感觉不错: 可以在submit里面写 PostBackUrl="XXXX",即回发的URL,可以实现 ...
- CSS Grid基于网格的二维布局系统(详细教程)
.grid-wrap{ display: inline-flex; padding: 20px; background: #f4f4f4; word-break: initial; } .handle ...
- Coursera, Big Data 1, Introduction (week 3)
什么是分布式文件系统?为什么需要分布式文件系统? 如果文件系统可以管理用网络连接的很多个存储单元,叫分布式文件系统. 分布式文件系统提供了数据可扩展性,容错性,高并发. 这些是传统文件系统不具有的. ...
- Python3:字符串的大小写和镜像字符串(swapcase()函数,chr(),ord(),translate()函数)
题目: 请编程实现字符串的转换:1. 将"adsdsfdndsdsdfsfdsdASDSDEDSFE18754"字符串大写变小写,小写变大写:2. 并且将字符串变为镜像字符串,例如 ...
- maven 分隔环境
在pom.xml 上 添加 把要分隔的环境 文件 弄成这样 打包 mvn clean package -Dmaven.test.skip=true -P+环境名 例子:mvn clean packag ...
- vue父子组件之间互相获取data值&调用方法(非props)
vue 子组件调用父组件方法&数据 vue有$parent这么一个属性,在子组件中就能拿到父组件的数据 this.$parent.xxx 就能调用父组件的方法 this.$parent.xxx ...
- 最清晰易懂的UML类图与类的关系详解
虚线箭头指向依赖: 实线箭头指向关联: 虚线三角指向接口: 实线三角指向父类: 空心菱形能分离而独立存在,是聚合: 实心菱形精密关联不可分,是组合: 上面是UML的语法. 在画类图的时候,理清类和类之 ...
- codeforces 1017C - Cloud Computing 权值线段树 差分 贪心
https://codeforces.com/problemset/problem/1070/C 题意: 有很多活动,每个活动可以在天数为$[l,r]$时,提供$C$个价格为$P$的商品 现在从第一天 ...
- GitHub界面初识
现在很多 HR 在招聘程序员的需求都会提到「有 Github 项目者优先」,大部分求职者也会在简历中附上 Github 链接. 作为一个专业的 HR,即便不懂代码,也不能被一个链接唬住.今天我就手 ...
- ubuntu 32/64 bit
https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit how to run 32-bit app ...