JavaScript学习笔记-JSON对象
JSON 是一种用来序列化对象、数组、数值、字符串、布尔值和 null 的语法。它基于 JavaScript 语法,但是又有区别:一些 JavaScript 值不是 JSON,而某些 JSON 不是 JavaScript 值
JSON表示的对象和数组: 属性名称必须用双引号包裹;最后一个属性后面不能有逗号。
JSON表示的数值: 前导0不能使用;小数点后面至少有一个数字。
JSON表示的字符串: 只有有限的字符能够被转义;通常不允许控制字符; 但允许使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ; 字符串必须用双引号括起来. 在Javascript中,下面的示例中 JSON.parse() 能够正常解析但 SyntaxError 会出错:
JSON.parse() 方法可以将一个 JSON 字符串解析成为一个 JavaScript 值,在解析过程中,还可以选择性的修改某些属性的原始解析值,
语法:JSON.parse(text[, func]),从text字符串解析出的一个 Object;
如果指定了func函数,则解析出的 JavaScript 值(解析值)会经过一次转换后才将被最终返回(返回值)。更具体点讲就是:解析值本身以及它所包含的所有属性,会按照一定的顺序(从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身)分别的去调func函数,在调用过程中,当前属性所属的对象会作为 this 值,当前属性名和属性值会分别作为第一个和第二个参数传入func中。如果func返回 undefined,则当前属性会从所属对象中删除,如果返回了其他值,则返回的值会成为当前属性新的属性值。当遍历到最顶层的值(解析值)时,传入 func 函数的参数会是空字符串 ""(因为此时已经没有真正的属性)和当前的解析值(有可能已经被修改过了),当前的 this 值会是 {"": 修改过的解析值},在编写 func 函数时,要注意到这个特例。
JSON.stringify() 方法可以将任意的 JavaScript 值序列化成 JSON 字符串
语法: JSON.stringify(JSvalue [, replacer [, space] ]) ,返回JSON字符串
可选参数replacer,如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;
可选参数space,用来控制结果字符串里面的间距。如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);如果是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)
var s1 = JSON.stringify({a:1,b:2,c:3,d:4}, ['a','b','c'],'属性:');
console.log(s1);
/*
{
属性:"a": 1,
属性:"b": 2,
属性:"c": 3
}
*/
关于序列化,有下面五点注意事项:
1.非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
2.布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
3.undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。
4.所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。
5.不可枚举的属性会被忽略
如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON 方法后的返回值会被序列化
var session = {
screens : [],
state : true,
toJSON:function() {
return{
screens_11:this.screens,
state_11: this.state
}
}
};
session.screens.push({"name":"screenA"});
session.screens.push({"name":"screenB"});
var jsonStr = JSON.stringify(session);
console.log(jsonStr);
//{"screens_11":[{"name":"screenA"},{"name":"screenB"}],"state_11":true}
var res = JSON.parse(jsonStr);
console.log(res);
//{ screens_11: [ { name: 'screenA' }, { name: 'screenB' } ],state_11: true }
完整的JSON语法如下:
JSON = null
or true or false
or JSONNumber
or JSONString
or JSONObject
or JSONArray
JSONNumber = - PositiveNumber
or PositiveNumber
PositiveNumber = DecimalNumber
or DecimalNumber . Digits
or DecimalNumber . Digits ExponentPart
or DecimalNumber ExponentPart
DecimalNumber = 0
or OneToNine Digits
ExponentPart = e Exponent
or E Exponent
Exponent = Digits
or + Digits
or - Digits
Digits = Digit
or Digits Digit
Digit = 0 through 9
OneToNine = 1 through 9
JSONString = ""
or " StringCharacters "
StringCharacters = StringCharacter
or StringCharacters StringCharacter
StringCharacter = any character
except " or \ or U+0000 through U+001F
or EscapeSequence
EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t
or \u HexDigit HexDigit HexDigit HexDigit
HexDigit = 0 through 9
or A through F
or a through f
JSONObject = { }
or { Members }
Members = JSONString : JSON
or Members , JSONString : JSON
JSONArray = [ ]
or [ ArrayElements ]
ArrayElements = JSON
or ArrayElements , JSON
空白字符可以出现在任意位置,但是数值类型的数字中间不能有空白字符,字符串中间不能随意添加空白字符,因为添加的空白字符会被解释为相应的字符值,从而引起错误。有效空白字符只包括制表符 (U+0009)、回车符 (U+000D)、换行符 (U+000A) 和空格 (U+0020) 。
JavaScript学习笔记-JSON对象的更多相关文章
- JavaScript:学习笔记(8)——对象扩展运算符
JavaScript:学习笔记(8)——扩展运算符 对象的扩展运算符 扩展运算符是三个点(...).用于取出参数对象的所有可遍历属性,然后拷贝到当前对象之中. 如上图所示,新建了一个对象a,然后通过扩 ...
- JavaScript学习笔记——BOM_window对象
javascript浏览器对象模型-windwo对象 BOM Browser Object Model window对象 是BOM中所有对象的核心. 一.属性 1.(位置类型-获得浏览器的位置) IE ...
- 10. JavaScript学习笔记——JSON
10. JSON ///[JSON是一种数据格式,不是JS 独有的] ///[JSON语法] /* 1.数据书写格式:"name":value,JSON要求给属性名加上[双引号], ...
- JavaScript学习笔记之对象
目录 1.自定义对象 2.Array 3.Boolean 4.Date 5.Math 6.Number 7.String 8.RegExp 9.Function 10.Event 在 JavaScri ...
- javascript学习-创建json对象数据,遍历
之前我已经有讲过后台返回json数据到前台,并在前台遍历json数据. 这里讲下直接在JS里创建JSON数据,然后遍历使用~ 创建代码例如以下:(创建的是JSON对象) var YearSelect ...
- JavaScript学习笔记——3.对象
JavaScript 对象 - 创建对象 1- var obj = new Object(); 2- var obj = {}; *例子:var person = {Name:"Hack&q ...
- JavaScript学习笔记——DOM_document对象
javascript-document对象详解 DOM document(html xml) object modledocument对象(DOM核心对象) 作用: 1.内容 innerHTML 2. ...
- Javascript学习笔记:对象的属性类型
在ECMAScript中有两种属性:数据属性和访问器属性 1.数据属性 configurable:表示能否通过delete删除属性从而重新定义属性:或者能否修改属性的特性:或者能否把属性修改为访问器属 ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
随机推荐
- bootstrap-table 分页的问题
文档网站 http://wenzhixin.net.cn/p/bootstrap-table/docs/examples.html#via-javascript-table 问题1 :服务器端取不到f ...
- Visual Studio 选择相同变量高亮
前段时间一直在使用matlab,今天需要使用vs2008,而用惯了matlab,习惯了其中一项选中变量高亮的设置,突然回来使用VS,感到各种不适应,顿时想到了一个词:矫情 呵呵,于是在网上找各种插件, ...
- [转载]TFS安装配置教程
最近公司新开发一个项目要用微软的TFS2013进行项目的源代码管理,以前只是用过SVN,从来没有用过TFS,所以在网上百度.谷歌了好一阵子来查看怎么安装和配置,还好花了一天时间总算是初步的搞定了,下面 ...
- [Node.js] DSL in action
原文地址:http://www.moye.me/2015/05/30/dsl-in-action/ 最近看了本有意思的书,受到了一些启发,在此记录一下: DSLs in action DSL是什么 ...
- golang中的race检测
golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...
- JavaScript基础插曲---apply,call和URL编码等方法
Js基础学习 Js的压缩: 就是利用js的语法格式通过缩短变量名,去掉空格等来进行压缩. Apply和call的使用 1:apply方法:应用某一对象的方法,用于一个对象替换当前对象.主要是改变thi ...
- 2005 TCO Online Round 1 - RectangleError
RectangleError Problem's Link Problem Statement You want to draw a rectangle on a piece of paper. Un ...
- The conversion of a varchar data type to a datetime data type resulted in an out-of-range value
刚刚有在程序中,传递一个空值至MS SQL Server数据库,这个值的数据类型为DATETIME执行时,它却发生了如标题提示的异常:The conversion of a varchar data ...
- 关于EF的 序列化类型为“XXX”的对象时检测到循环引用。
在用Ef的时候,也许经常会遇到循环引用的错误. 下面提供解决办法.(不是Json.Net,如果是Json.Net可以给导航属性通过增加特性标签来解决该问题) ef大多数问题,可以通过ToList()来 ...
- easyui-layout 布局自适应
最近在把以前写的一个项目改成用easyui做前端.过程中遇到了不少问.其中一个就是datagrid不能很好的布.想了好多办法都有局限.最后想到会不会是布局的问题,经过实,最后问题解. 1:比如在项目中 ...