文介绍了兼容ECMAScript 5 标准的原生JSON对象. 在不支持原生JSON对象的旧版本Firefox中,该如何处理JSON数据.请查看 JSON.

原生JSON对象包含有两个关键方法.JSON.parse()方法用来解析JSON字符串,并且重构为JavaScript对象,而JSON.stringify()方法可以将javascript对象转换为等价的JSON字符串.

注意:由于JSON规范的限制,如果一个对象存在属性值为函数的属性,则在使用JSON.stringify()方法对该对象进行序列化时.这个属性将不会被遍历到.

解析JSON字符串

将JSON字符串解析成为一个JavaScript对象,你只需要将JSON字符串作为参数传递给JSON.parse()方法,如下:

var jsObject = JSON.parse(jsonString);
 

JavaScript 1.8.5 备注

引入于 JavaScript 1.8.5 (Firefox 4), JSON.parse()不允许最后一个键值对后面存在逗号

// JavaScript 1.8.5中,下述两行代码都会抛出SyntaxError异常
var jsObject = JSON.parse("[1, 2, 3, 4, ]");
var jsObject = JSON.parse("{ \"foo\" : 1, }");
 

将对象转为JSON

将一个JavaScript对象字符串化为JSON,你只需要将该对象作为参数传递给JSON.stringify()方法,如下:

var foo = {};
foo.bar = "new property";
foo.baz = 3; var jsonString = JSON.stringify(foo);
 

jsonString 的新值为'{"bar":"new property","baz":3}'.

从Firefox 3.5.4起, JSON.stringify()提供一个可选参数来提供额外的自定义转换方法的能力.如下:

jsonString = JSON.stringify(value [, replacer [, space]])

value
将要转为JSON字符串的javascript对象.
replacer
该参数可以是多种类型,如果是一个函数,则它可以改变一个javascript对象在字符串化过程中的行为, 如果是一个包含 String 和 Number 对象的数组,则它将作为一个白名单.只有那些键存在域该白名单中的键值对才会被包含进最终生成的JSON字符串中.如果该参数值为null或者被省略,则所有的键值对都会被包含进最终生成的JSON字符串中.
space
该参数可以是一个 String 或 Number 对象,作用是为了在输出的JSON字符串中插入空白符来增强可读性. 如果是Number对象, 则表示用多少个空格来作为空白符; 最大可为10,大于10的数值也取10.最小可为1,小于1的数值无效,则不会显示空白符. 如果是个 String对象, 则该字符串本身会作为空白符,字符串最长可为10个字符.超过的话会截取前十个字符. 如果该参数被省略 (或者为null), 则不会显示空白符.

replacer 参数

replacer参数可以是一个函数或者是一个数组.如果是函数, 则该函数会被传入两个参数, 分别是当前正在被字符串化的键值对的键和值. 初始化时,一个默认的键值对(键为空,值为要JSON化的对象)会传入这个函数, 然后,要JSON化的对象或者数组的每个键值对也会一级一级被传入这个函数. 该函数的返回值会影响正在被字符串化的键值对会不会被加入最终生成的JSON字符串中化,如下:

  • 如果返回一个 Number 类型的值, 则该数字会通过toString方法转换成字符串,来作为正在被字符串化的键值对中的值被添加到JSON字符串中.
  • 如果返回一个 String 类型的值, 则该字符串会作为正在被字符串化的键值对中的值被添加到JSON字符串中.
  • 如果返回一个Boolean类型的值, 则该布尔值会转化成字符串"true"或"false" ,来作为正在被字符串化的键值对中的值被添加到JSON字符串中.
  • 如果返回一个其他类型的对象, 则该对象的键值对会被递归的按照上述的规则添加到JSON字符串中, 但如果该对象是function类型的, 则它不会变遍历.replacer函数会转而处理下一个键值对.
  • 如果返回 undefined, 则该键值对不会被添加到JSON字符串中.
注意: 你不能通过 replacer 函数剔除数组中的某些值.

例子

function censor(key, value) {
if (typeof(value) == "string") {
return undefined;
}
return value;
} var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo, censor);
 

jsonString 的新值为{"week":45,"month":7}.

如果 replacer 是一个数组, 则源对象中,只有键存在replacer数组中的键值对,才会被包含进最终的JSON字符串中.

相关链接

Using native JSON的更多相关文章

  1. #MySQL 5.7.8 支持Json类型

    As of MySQL 5.7.8, MySQL supports a native JSON data type that enables efficient access to data in J ...

  2. JSON的故事

    1.介绍JSON http://www.json.org/ https://developer.mozilla.org/zh-CN/docs/JSON 2.json的序列化和反序列化 序列化方法 va ...

  3. [转] json in javascript

    JavaScript is a general purpose programming language that was introduced as the page scripting langu ...

  4. JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法

    1. JSON.parse(jsonString): 在一个字符串中解析出JSON对象 var str = '[{"href":"baidu.com",&quo ...

  5. 转:关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法

    1. JSON.parse(jsonString): 在一个字符串中解析出JSON对象 ? 1 2 3 var str = '[{"href":"baidu.com&qu ...

  6. 数据序列化导读(3)[JSON v.s. YAML]

    前面两节介绍了JSON和YAML,本文则对下面的文章做一个中英文对照翻译. Comparison between JSON and YAML for data serialization用于数据序列化 ...

  7. jQuery.parseJSON vs JSON.parse

    转载:http://stackoverflow.com/questions/10362277/jquery-parsejson-vs-json-parse 一.JavaScript函数JSON.par ...

  8. JSON.parse()和jQuery.parseJSON()的区别

    jQuery.parseJSON(jsonString) : 将格式完好的JSON字符串转为与之对应的JavaScript对象   (jquery 方法) 1 2 3 var str = '[{&qu ...

  9. mysql json

    SELECT name, profile->"$.twitter" AS `twitter` FROM `user` WHERE profile->"$.tw ...

随机推荐

  1. Helix Server流媒体服务器架设教程(附Helix Server11.01下载)

    现在D版的远古影视系统很流行,也很实用,但是在这之前,很多人都是用共享,或者是使用Helix Server留媒体来做电影服务器~ 虽然Helix Server流媒体服有点落伍了,不过我相信它还是有用武 ...

  2. POJ1287 Networking

    解题思路:Kruskal模板题,重复输入的情况,本题是无向图. 见代码: #include<cstdio> #include<algorithm> #include<cs ...

  3. ERP与MES

    EAS-ERP企业资源计划系统 能将企业的客户管理.商品管理.采购管理.仓储管理.销售管理.生产管理.应收应付.财务管理.工资管理.费用管理和业绩考核管理以及业务预警和全方位的分析汇总融为一体,为企业 ...

  4. LG4360 [CEOI2004]锯木厂选址

    题意 原题来自:CEOI 2004 从山顶上到山底下沿着一条直线种植了 n 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个锯木厂 ...

  5. C++输入流和输出流、缓冲区

    一.C++输入流和输出流 输入和输出的概念是相对程序而言的. 键盘输入数据到程序叫标准输入,程序数据输出到显示器叫标准输出,标准输入和标准输出统称为标准I/O,文件的输入和输出叫文件I/O. cout ...

  6. 《笔者带你剖析Apache Commons DbUtils 1.6》(转)

    前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更 多的是依靠Hibernate.Ibatis.Spring JDBC.JPA等大厂提供的持久层技术解决方案, ...

  7. .NET 应用程序域?

    为了提升windows系统的稳定性与可靠性,windows通过进程来实现.所有的可执行代码.数据以及其他资源都被包含在进程中,不允许其他进程对它进行访问(除非有足够的权限).对于.NET应用程序,还进 ...

  8. 64位windows下mysql安装

    登入mysql官网https://www.mysql.com/downloads/,点击Community,选择MySQL on Windows,选择MySQL Installer,选择MySQL S ...

  9. MySQL 当记录不存在时insert,当记录存在时update(ON DUPLICATE KEY UPDATE, REPLACE语句)

    MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法. 第一种:示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语 ...

  10. 根文件系统的构建与分析(四)之瑞士军刀busybox生成系统基本命令

    根文件系统的构建与分析(四) 转载请注明 http://blog.csdn.net/jianchi88   Author:Lotte   邮箱:baihaowen08@126.com ls /bin, ...