JSON与js对象序列化实例详解


Posted in Javascript onMarch 16, 2017

本文实例讲述了JSON与js对象序列化。分享给大家供大家参考,具体如下:

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

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

JSON有六种类型的值:对象,数组,字符串,数字,布尔值和特殊值null。

console.log(JSON.parse('5')); // 5
console.log(JSON.parse(5)); // 5
console.log(JSON.parse('true')); // true
console.log(JSON.parse(true)); // true
console.log(JSON.parse('"hello"')); // "hello"
console.log(JSON.parse("hello")); // 报错 因为hello不是JSON字符串
console.log(JSON.parse('null')); // null
console.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;
    }
  }));
Javascript 相关文章推荐
js数组转json并在后台对其解析具体实现
Nov 20 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
Nov 21 Javascript
js使用循环清空某个div中的input标签值
Sep 29 Javascript
js和jquery分别验证单选框、复选框、下拉框
Dec 17 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
May 12 Javascript
基于Javascript实现文件实时加载进度的方法
Oct 12 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
Nov 08 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
Jan 06 jQuery
jQuery删除/清空指定元素的所有子节点实例代码
Jul 04 jQuery
JavaScript 作用域实例分析
Oct 02 Javascript
node.js中npm包管理工具用法分析
Feb 14 Javascript
vue页面引入three.js实现3d动画场景操作
Aug 10 Javascript
JS对象的深度克隆方法示例
Mar 16 #Javascript
JS对象深度克隆实例分析
Mar 16 #Javascript
JS异步加载的三种实现方式
Mar 16 #Javascript
Bootstrap免费字体和图标网站(值得收藏)
Mar 16 #Javascript
基于JavaScript实现滑动门效果
Mar 16 #Javascript
基于Vue2.0的分页组件
Mar 16 #Javascript
原生js实现验证码功能
Mar 16 #Javascript
You might like
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
2007/11/30 Javascript
JavaScript 字符串乘法
2009/08/20 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
Python合并字符串的3种方法
2015/05/21 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
pytorch的batch normalize使用详解
2020/01/15 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
新手学python应该下哪个版本
2020/06/11 Python
为什么是 Python -m
2020/06/19 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
大学军训自我鉴定
2013/12/15 职场文书
会计自荐信范文
2014/03/09 职场文书
2014年食堂工作总结
2014/11/20 职场文书
简历自我评价优缺点
2015/03/11 职场文书
小学思想品德教学反思
2016/02/24 职场文书
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS