首页 > 语言 > JavaScript > 正文

JavaScript解析及序列化JSON的方法实例分析

2024-05-06 15:43:36
字体:
来源:转载
供稿:网友

本文实例讲述了JavaScript解析及序列化JSON的方法。分享给大家供大家参考,具体如下:

JSON 之所以这么流行,是因为 JSON 数据结构可以被解析为 JavaScript 对象。JSON 之前的 XML 数据结构要被解析,需要先解析成 DOM 文档,然后再从中提取出数据。相比之下,JSON 数据结构方便多咯O(∩_∩)O~

所以 JSON 就成为 web 开发中,用于数据交换的事实标准。

1 JSON 对象

早期的 JSON 解析器是使用 JavaScript 的 eval() 函数。因为 JSON 是 JavaScript 语法的子集,所以 eval() 函数可以解析并返回 JavaScript 对象。但使用这个函数存在风险,因为有可能会被执行一些恶意的代码!ECMAScript 5 定义了全局对象 JSON。支持这个对象的浏览器有 IE8+、Firefox 3.5+、Safari 4+、Chrome 和 Opera 10.5+。而旧版的浏览器建议使用 JSON-js 库。

JSON 对象有两个方法:

1. stringify(),会把 JavaScript 对象序列化为 JSON 字符串。
2. parse(),会把 JSON 字符串解析为原生的 JavaScript 对象。

<script type="text/javascript">var book = {  title: "music",  authors: ["deniro"],  edition: 1,  year: 2017};var jsonText = JSON.stringify(book);console.log(jsonText);var bookCopy = JSON.parse(jsonText);console.log(bookCopy);</script>

默认情况下,JSON.stringify() 输出的字符串不包含任何空格字符以及缩进。而且所有的函数以及原型成员都会被有意忽略。此外,值为 undefined 的属性也会被跳过。所以结果中都是值为有效的属性。

注意:上面代码中的 book 与 bookCopy 虽然具有相同的属性,但它们是两个独立的、没有任何关系的对象。

如果传给 JSON.parse() 的字符串不是有效的 JSON 字符串,就会抛出错误。

2 序列化选项

JSON.stringify() 还可以接收另外两个参数。第二个参数是过滤器,可以是数组,也可以是函数;第三个参数表示是否在 JSON 字符串中保留缩进。

2.1 过滤结果

如果过滤器的参数是数组,那么结果中将只会包含这个数组所列出的属性:

<script type="text/javascript">var book = {  title: "music",  authors: ["deniro"],  edition: 1,  year: 2017};//过滤结果var jsonTextAfterFilter=JSON.stringify(book,["title","edition"]);console.log(jsonTextAfterFilter);//{"title":"music","edition":1}</script>

如果过滤器的参数是函数,那么这个函数会接收两个参数,属性名和属性值。属性名只能是字符串,如果它所对应的属性值不是键值对结构的值时,那么属性名可以是空字符串。这个函数的返回值就是相应属性名对应的值。如果函数返回 undefined,那么相应的属性就会被忽略:

<script type="text/javascript">  var book = {    title: "music",    authors: ["deniro"],    edition: 1,    year: 2017  };  var jsonText = JSON.stringify(book, function (key, value) {    switch (key) {      case "authors":        return value.join(",");      case "year":        return 10000;      case "edition":        return undefined;      default :        return value;    }  });  console.log(jsonText);//{"title":"music","authors":"deniro","year":10000}</script>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选