JSON与JavaScript对象

JSON是一种表示结构化数据的存储格式,语法格式上与JavasScript对象有些类似。

TIPS: 与JavaScript对象的格式区别

  1. 不支持变量、函数或对象实例
  2. 字符串,属性名必须使用双引号
  3. 无需定义变量存储引用
// JSON对象
{
"name": "KenTsang",
"age": 27,
"job": "Developer"
} // js对象(该对象将作在后续例子引用)
let person = {
name: 'KenTsang',
age: 27,
job: 'Developer'
}

ES5定义了一个全局对象JSON,IE8+以上支持,该对象提供来stringifyparse两个方法用于JSON数据解析和序列化。

stringify()

stringify用于把JavaScript对象序列化JSON字符串,

在序列化JavaScript对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined的任何属性也都会被跳过。

JSON.stringify(
value: Object,
replace: Array | function(key,value) {},
space: number | string
)

该方法接受三个参数

  1. 参数:接收传入的js对象
  2. 参数:过滤器(数组/函数)
  3. 参数:字符串缩进(数值/字符串)

参数2 - 过滤器

TIPS1: 过滤器是一个数组时,序列化结果只包含数组中列出的属性

let result = JSON.stringify(person, ["name", "job"]);

// 输出结果
// {"name":"KenTsang","job":"Developer"}

TIPS2: 过滤器是一个函数时(替换函数)

var jsonStr = JSON.stringify(Person, function(key, value){
if (key == 'age') {
return 'secret';
} else {
return value;
}
}) // 输出结果
// {"name":"KenTsang","age":"secret","job":"Developer"}

如果替换函数返回的是undefined,则该属性不会被包含在序列化结果中。

参数3 - 字符串缩进

用于控制序列化结果中的缩进和空白符,输出序列结果带缩进格式,方便预览查看。实际应用开发不多。

  1. 为数值时,表示每个级别缩进的空格数(最大10)
  2. 为字符串时,则作为缩进字符(替换默认的空格,最大10个字符)
let result = JSON.stringify(person, null, '--');

// 输出结果
/*
{
--"name": "KenTsang",
--"age": 27,
--"job": "Developer"
}
*/

toJSON()方法

应对更复杂的一些需求,我们可以通过toJSON()对某些对象进行自定义序列化的需求。

let person = {
name: "KenTsang",
age: 27,
job: 'Developer',
toJSON: function() {
return {
"name": "KT",
"age": "2*",
"job": "DP"
}
}
}; let result = JSON.stringify(person); // 输出结果
// {"name":"KT","age":"2*","job":"DP"}

TIPS: 序列化顺序

  1. 如果存着toJSON方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
  2. 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步的值。
  3. 对第(2)步返回的每个值进行相应的序列化。
  4. 如果提供了第三个参数,执行相应的格式化。

-- 摘自《JavaScript高级程序设计》--

parse()

parse用于把JSON字符串解析成JavaScript对象

JSON.parse(text: string, reviver: function(key, value) {})

该方法接受三个参数

  1. 参数:接收传入的json字符串
  2. 参数:还原函数

还原函数

  1. 返回undefined, 结果中删除相应的键
  2. 返回其它值,则将值插入到结果中
let Person = {
name: "KenTsang",
age: 27,
job: "Developer",
birth: new Date(1991, 3, 19)
}; var jsonStr = JSON.stringify(Person);
var jsObj = JSON.parse(jsonStr, function(key, value) {
if (key == 'birth') {
return new Date(value);
} else {
return value);
}
}); jsObj.birth.getFullYearh(); // 输出结果: 1991

例子中通过还原函数,重新实例一个Date对象,所以可以用到getFullYear()方法。


参考文档

作者:以乐之名

本文原创,有不当的地方欢迎指出。转载请指明出处。

读书笔记(01) - JSON - JavaScript高级程序设计的更多相关文章

  1. 读书笔记(02) - 可维护性 - JavaScript高级程序设计

    编写可维护性代码 可维护的代码遵循原则: 可理解性 (方便他人理解) 直观性 (一眼明了) 可适应性 (数据变化无需重写方法) 可扩展性 (应对未来需求扩展,要求较高) 可调试性 (错误处理方便定位) ...

  2. 读书笔记(05) - 事件 - JavaScript高级程序设计

    HTML依托于JavaScript来实现用户与WEB网页之间的动态交互,接收用户操作并做出相应的反馈,而事件在此间则充当桥梁的重要角色. 日常开发中,经常会为某个元素绑定一个事件,编写相应的业务逻辑, ...

  3. 读书笔记(03) - 性能 - JavaScript高级程序设计

    作用域链查找 作用域链的查找是逐层向上查找.查找的层次越多,速度越慢.随着硬件性能的提升和浏览器引擎的优化,这个慢我们基本可以忽略. 除了层级查找损耗的问题,变量的修改应只在局部环境进行,尽量避免在局 ...

  4. 学习笔记:《JavaScript高级程序设计》

    第1章 JavaScript简介 1.一个完整的JavaScript实现应该由三部分组成:核心(ECMAScript),文档对象模型(DOM)和浏览器对象模型(BOM). 2.Web浏览器只是ECMA ...

  5. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  6. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  7. JavaScript高级程序设计(读书笔记)(一)

    本笔记汇总了作者认为“JavaScript高级程序设计”这本书的前七章知识重点,仅供参考. 第一章 JavaScript简介 JavaScript发展简史: 1995年,JavaScript诞生 19 ...

  8. 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...

  9. (读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)

    ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的.在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理. arguments对象只是 ...

随机推荐

  1. [好文分享]MySQL 加锁处理分析

    原文转自:http://hedengcheng.com/?p=771 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经 ...

  2. noip2017d1t1

    我们知道因为a,b互质,ax+by=n若存在一组解(x0,y0),则(x0+kb,y0-ka)也是一组解,而我们要保证有正整数解的情况下n最大,我们不妨将x0设为最大的负整数-1,考虑最大的y0能为多 ...

  3. hdu 2642 Stars 【二维树状数组】

    题目 题目大意:Yifenfei是一个浪漫的人,他喜欢数天上的星星.为了使问题变得更容易,我们假设天空是一个二维平面,上面的星星有时会亮,有时会发暗.最开始,没有明亮的星星在天空中,然后将给出一些信息 ...

  4. hdu 1541

    因为y的输入是从小到大,所以不用考虑y坐标的问题 只考虑x坐标就行 还有个小细节就是0<=x,y,<=32000  x和y取0的时候树状数组处理不到 x++就行了 #include < ...

  5. poj3924

    题目:给定一个起点(xw1, yw1),直线经过(xw2, yw2),速度为vw无限运动的点,还有一个起点(xt1, yt1),终点(xt2, yt2),并且在以vt速度在两者往返运动,求两者在运动中 ...

  6. PhantomJS快速入门-无界面浏览器

    https://blog.csdn.net/libsyc/article/details/78199850 PhantomJS快速入门 本文简要介绍了PhantomJS的相关基础知识点,主要包括Pha ...

  7. (原创)用c++11打造好用的any

    上一篇博文用c++11实现了variant,有童鞋说何不把any也实现一把,我正有此意,它的兄弟variant已经实现了,any也顺便打包实现了吧.其实boost.any已经挺好了,就是转换异常时,看 ...

  8. node-webkit学习(3)Native UI API概览

    node-webkit学习(3)Native UI API概览 文/玄魂 目录 node-webkit学习(3)Native UI API概览 前言 3.1  Native UI api概览 Exte ...

  9. 电子书推荐--《Python灰帽子》,python黑客编程

    点此在线阅读 <Python灰帽子>是由知名安全机构Immunity Inc的资深黑帽Justin Seitz主笔撰写的一本关于编程语言Python如何被广泛应用于黑客与逆向工程领域的书籍 ...

  10. C# 简述Action与function

    Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托. 最初使用委托时,均需要先定义委托类型,然后定义一个符合委托类型签名的函数,在调用前,需声明并创建委托对象,将指定 ...