JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集。虽然是一个js的子集但是他与语言无关,它可以用于在现在所有的编程语言编写的应用程序之间进行数据交换。是一种文本格式,比较容易读写。

JSON是一个容纳“名/值”对的无序集合,名字可以是任意字符串,值可以使任意的JSON类型的值。大多数编程语言都有被映射为JSON的数据类型,比 如对象(object),字典(dictionary),哈希表(hash map),关联数组(associative array)等。

JSON有六种类型的值:对象,数组,字符串,数字,布尔值和特殊值null。
    console.log(JSON.parse('5')); // 5console.log(JSON.parse(5)); // 5
console.log(JSON.parse('true')); // trueconsole.log(JSON.parse(true)); // true
console.log(JSON.parse('"hello"')); // "hello"console.log(JSON.parse("hello")); // 报错 因为hello不是JSON字符串
console.log(JSON.parse('null')); // nullconsole.log(JSON.parse(null)); // null
console.log(JSON.parse(undefined)); // 报错 因为JSON不能表示undefined换用null代替

JSON的结构

JSON具有两种结构:对象,数组
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字字符串和值之间以”:”分隔,语法结构如代码。
{key1:value1,key2:value2,...
}

例如:

{"name": "hum","age": 26,"sex": 1,"love": ["swing","jump"],"birthday": "1988-01-12"
}

NOTE:

  在js中表示JSON字符串时最好在外面加上单引号。

如下:

 console.log(JSON.parse('{"num":5,"stop":true,"str":"hello","empty":null}'));// object{num:5,stop:true,str:"hello",empty: null}

与js对象字面量相比,JSON对象没有变量声明也没有末尾的分号。

数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

[{key1:value1,key2:value2,...}
]

例如:

[  {  "Id": 7,  "Mentions": [  {  "Id": 5,  "StatusId": 34,  "CreatedDateTime":"\/Date(1310051914617+0100)\/",  "Text":"Text",  "UserName":"Username",  "UserLocation":"UK",  "UserLanguage":"en-GB",  "IsCheckIn":"true"   }  ],  "Checkins": 0,  "HereNow": 0,  "TimeStamp":"\/Date(1310051914639+0100)\/",  "Venue": {  "Id": 7,  "FoursquareId":"cacbf3bd-f0aa-403d-9f9b-2056b4985ba1",  "Name":"Venue Name"  }  },{"name":"hahahhahah","port":[{"port": 8080,"protocol":"HTTP","IP":"123.12.06.456"}  ]}
]

JSON数组采用的是javascript数组字面量的形式。

JSON的解析与序列化

js的JSON的解析与序列化与AS3是相同的。我们常用的也就是JSON对象(ECMAScript 5中添加的, 早期JSON解析基本都使用javascript的eval()函数。但是eval有一些性能和安全上的缺点,ECMAScript对解析JSON对象进 行了规范,定义了全局对象JSON,支持的浏览器有标准浏览器和IE8+。对于不支持的浏览器可以引入json2.js文件。)的stringify与parse这两个方法。
接下来我们来一一说明。

JSON.stringify

JSON.stringify()将javascript对象序列化为JSON格式的字符串
JSON.stringify(ob,filter,indent)包含三个参数,通常我们在使用的时候只带第一个参数,来返回字符串。
ob:要转化成JSON字符串的对象,数组,原始值。
filter:是一个可选的参数,通常是一个函数,用来在字符串化前对值做一些替换。也可以是一个数组,包含哪些需要字符串化的属性名。就是用来过滤的。
indent:也是一个可选参数,在需要输出格式化的可阅读的代码时,使用indent参数来指定用来缩进的字符串或空格。如果省略该参数,返回的字符串将不带任何的额外的空格,这样输出的值很难阅读。就是用来格式化的。
下面是几个对应的例子:
首先是第二个参数是数组过滤器的时候:
var oJson = { name: 'hum', age: 20, sex: 1};
console.log(JSON.stringify(oJson, ['age', 'sex'])); // {"age":20,"sex":1}

如果第二个参数是字符串的时候,该数组会作为对象的属性名,属性名不在这个数组中的任何对象的属性在序列化的时候都会被忽略掉。此外,返回的字符串中的属性的顺序,会与该数组中的属性名一致。
函数过滤器的时候:
var oJson = { name: 'hum', age: 26, sex: 1, love: ['swing', 'jump']};console.log(JSON.stringify(oJson, function(k, v){switch (k){case 'age':return v > 20 ? '成年': '未成年';case 'love':return v.join(',');case 'sex':return undefined;default :return v;}})); // {"name":"hum","age":"成年","love":"swing,jump"}

如果该参数是函数,则它是一个替换函数,该函数会在每一个需要字符串化的对象上调用。这个函数的第一个参数是该对象中的属性名或数组的序号,第二个则是值本身。函数的返回值会替换掉需要字符串化的值,如果函数返回undefined或没有任何的返回值,则会在字符串化的时候忽略这个值。

stringify的第三个参数的实例:

var oJson = { name: 'hum', age: 26, sex: 1, love: ['swing', 'jump']};console.log(JSON.stringify(oJson, null, 4));/*{"name": "hum","age": 26,"sex": 1,"love": ["swing","jump"]}*/

通常这个方法的返回值是一个不带任何空格或换行符的给机器阅读的字符串,如果想输出更易于阅读的代码,就需要设置第三个参数了。
再来看一个例子:
var oJson = { name: 'hum', age: 26, sex: 1, love: ['swing', 'jump']};console.log(JSON.stringify(oJson, null, '--'));/*{--"name": "hum",--"age": 26,--"sex": 1,--"love": [----"swing",----"jump"--]} */

这样就很容易理解了。。。

JSON.parse

JSON.parse用来解析json格式的字符串(返回一个对象,数组或原始值)
JSON.parse(s,reviver)包含两个方法.
s:要解析的字符串
reviver:用来转换解析值得可选函数
我们通常使用只使用第一个参数,可选参数reviver,主要是在返回解析值之前,对其进行过滤或后期处理。reviver函数会在从s中解析的每个原始值调用一次。调用reviver函数是带有两个参数,第一个属性名(对象的属性名或是转换成字符串的数组序号),第二个参数是对象的属性或是数组的元素值。reviver函数会作为包含原始值的对象/数组的方法来调用。reviver函数的返回值会成为属性的新值,如果reviver返回第二个参数,则属性不变。如果reviver返回undefined或不凡会任何值,则会从对象或是数组中删除属性。
下面是一个实例:
var oJson = { name: 'hum', age: 26, sex: 1, love: ['swing', 'jump'], birthday: '1988-01-12'};var sJson = JSON.stringify(oJson);console.log(sJson);//{"name":"hum","age":26,"sex":1,"love":["swing","jump"],"birthday":"1988-01-12"}
    console.log(JSON.parse(sJson));console.log(JSON.parse(sJson, function (k, v) {if(k == 'birthday'){ // 返回日期对象return new Date(v);}else if(k == 'sex'){ // sex不在了return undefined;}else{return v;}}));

转载于:https://www.cnblogs.com/duhuo/p/4526538.html

JSON与js对象序列化相关推荐

  1. JSON 和 JS 对象互转

    JSON 和 JS 对象互转 要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法: var json = JSON.stringify({a: 'Hello', b: ...

  2. JSON转换为JS对象和JS对象转换为JSON

    1. JSON转换为JS对象 名称 parse 类型 执行类 参数 json: string JSON字符串 返回值 js对象 示例 parse('{"a":"abc&q ...

  3. JSON转JS对象,JS对象转JSON

    JSON转JS对象,JS对象转JSON </h1><div class="clear"></div><div class="po ...

  4. Javascript学习笔记——JSON:js对象简谱

    Javascript不仅是一种编程语言,还被作为一种常用的对象存储和传输格式 JSON:JS 对象简谱 JSON(JavaScript Object Notation)即Javascript对象简谱 ...

  5. json和JS对象转换

    json语法格式: 对象表示为键值对 数据由逗号分隔 花括号保存对象 方括号保存数据 JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串. var obj = {a: ...

  6. JSON 与 JS 对象的区别

    JSON 概述 JSON(JavaScript Object Notation),JS 对象表示法. JSON 是 JS 对象的一种描述方式,使 JS 对象能够以文本的方式记录下来,所以 JSON 是 ...

  7. JSON与JS对象的区别

    和一些同学一样:总是感觉json对象(其实json不是对象)和js对象的字面量表示法相同,最近学习json,真心搞不懂,js对象和json有什么区别?就是感觉json的key要用" &quo ...

  8. 将JS对象转换为JSON |将JSON转换为JS对象

    一.将JSON字符串为JS对象 在JS中,如果直接输入 var arr = {arr:[1,2,3]}; 返回的是一个object对象 因此如果我们需要将其转换为JSON,可以用如下方式进行转换 va ...

  9. JSON和JS对象之间的互转

    1. jQuery插件支持的转换方式 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2. 浏览器支持的 ...

最新文章

  1. iis上实现虚拟目录
  2. oracle 关闭audit,关于Oracle审计(audit)
  3. mootools1.3.1源码解读
  4. [数学笔记Mathematical Notes]2-一个带对数的积分不等式
  5. ServiceComb开放性设计
  6. 如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢?
  7. spi flash驱动
  8. springboot配置文件加载顺序_「SpringBoot系列」配置文件加载优先级解析
  9. Android新的menu实现——ActionMode
  10. (@WhiteTaken)设计模式学习——代理模式
  11. 树分解 宽度 如何分解 算法
  12. 58技术主席孙玄:硬核揭秘万亿级微服务分布式事务实战!
  13. Android ADB 环境变量配置
  14. 输入输出文件处理:搜索文件夹里的文件与读取某一文件的信息 ——java
  15. 下载CSS参考手册之后打开却无法显示
  16. 2020年(农历庚子鼠年)春联大全(收藏必备)
  17. 阅读高效能人士七个习惯
  18. 17.安全点与安全区
  19. 林光常颠覆传统的养生观 ,养生必读
  20. z变换判断稳定性和因果性_信号与系统(奥本海姆)

热门文章

  1. 剑网三谜题终于揭开,药宗四系开合得当,有输出有治疗
  2. Java多线程精讲(非高并发-授课专用)附synchronized
  3. 【实施工程师】ARP——地址解析协议(高清版本)
  4. 前端性能优化—将CSS文件放在顶部
  5. jsonp的原理·jsonp是不是ajax中实现跨域访问的技术
  6. OCM备考 一、Server config 之网络配置
  7. Robot Framework操作mongodb数据库
  8. 关于线性条形码符号的解读(一)
  9. TCP/IP协议(二)tcp/ip基础知识
  10. 201521123011 《Java程序设计》第8周学习总结