文介绍了兼容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. C/C++ 安全编码 —— 指针与内存

    1. 仿踩内存 if (buf[len - 1] != 0x5A) { return; }

  2. .net 系列化与反序列化(转载)

    .net序列化及反序列化 转载自:http://www.cnblogs.com/Tim_Liu/archive/2010/11/09/1872587.html 序列化是指一个对象的实例可以被保存,保存 ...

  3. Android tcpdump 使用

    /************************************************************************** * Android tcpdump 使用 * 说 ...

  4. 9.9 Python 文档字符串

    9.9 Python 文档字符串. 进入 Python 标准库所在的目录. 检查每个 .py 文件看是否有__doc__ 字符串, 如果有, 对其格式进行适当的整理归类. 你的程序执行完毕后, 应该会 ...

  5. HDU - 5297:Y sequence (迭代&容斥)

    Yellowstar likes integers so much that he listed all positive integers in ascending order,but he hat ...

  6. c#和c++互操作(平台调用相关)

    [DllImport("ScreenCaptureLib.dll", CallingConvention = CallingConvention.Cdecl)] public st ...

  7. 基于Python语言使用RabbitMQ消息队列(六)

    远程过程调用(RPC) 在第二节里我们学会了如何使用工作队列在多个工人中分布时间消耗性任务. 但如果我们想要运行存在于远程计算机上的方法并等待返回结果该如何去做呢?这就不太一样了,这种模式就是常说的远 ...

  8. nodejs docker 开发最好选择yarn 进行包管理而不是npm

    npm 与yarn 的区别网上一大堆的文章,我们在构建docker 镜像是应该遵守的有些原则   基础镜像尽量小 对于构建进行缓存处理 构建的docker 的文件层数尽量少 能直接运行的,就别进行重复 ...

  9. assembly 需要 unload 和 update 的时候怎么办?

    我正在开发公司的业务组件平台,组件池的灵活性要求很高,业务组件都是可以立即更新和及时装配的;目前完成这些功能,有待测试.用appDomain.unload 拆卸assembly 可以,只是用起来比较麻 ...

  10. c#联网判断

    引用命名空间:sing System.Net.NetworkInformation; var address = "www.baidu.com"; Ping ping = null ...