JSON是一种数据格式,它并不从属于JavaScript,很多语言都有JSON的解析器和序列化器。

语法

JSON可以表示三种类型:

  • 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。
  • 对象:表示一组无序的键值对。键值对中的值可以是简单值,也可以是复杂数据类型。
  • 数值:表示一组有序的值的列表,数组的值可以是任意类型。

JSON不支持变量、函数或对象实例,是一种表示结构化数据的格式。

简单值

JSON数据形式:

5    // 数值
"Hello JavaScript" // 字符串
null

对象

与JavaScript不同,JSON中的对象要求给属性加上引号

{
"name": "萧萧弈寒";
"age": 100
} // 属性的值也可以是复杂类型
{
"school": {
"name": "hafo",
"location": "Harbin"
}
}

数组

JSON表示数组:

[100, "萧萧弈寒", true]

JSON数组没有变量和分号。

把数组和对象结合,可以构造复杂的数据集合:

[
{
"title":"Java从入门到放弃",
"authors":[
"张三"
],
edition: 2
},
{
"title":"MySQL从删库到跑路",
"authors":[
"李四"
],
edition: 3
},
{
"title":"Dreamweaver从安装到卸载",
"authors":[
"王五"
],
edition: 4
}
]

解析与序列化

JSON对象

JSON对象有两个方法:

  • stringfy():把JavaScript对象序列化为JSON字符串
  • parse():。把JSON字符串解析为原生JavaScript值

示例:

var book = {
"title":"Java从入门到放弃",
"authors":[
"张三"
],
edition: 2
};
var jsonText = JSON.stringify(book);
alert(jsonText); // {"title":"Java从入门到放弃","authors":["张三"],"edition":2}

上面的例子将一个JavaScript对象序列化为一个JSON字符串。默认情况下,JSON.stringify()不包含任何字符或缩进。

将JSON字符串直接传递个JSON.parse()可以得到相应的JavaScript值。

var newBook = JSON.parse(jsonText);    

book与newBook具有相同的属性,但是彼此是相互独立的。

序列化选项

JSON.stringify()还可以接收两个参数:

  • 第一个参数:过滤器,一个数组或一个函数。
  • 第二个参数:一个选项,表示是否在JSON字符串中保留缩进

过滤结果

如果参数是数组,JSON.stringify()的结果只包含数组中列出的属性。

var book = {
"title":"Java从入门到放弃",
"authors":[
"张三"
],
edition: 2
};
var jsonText = JSON.stringify(book, ["title", "authors"]);
console.log(jsonText); // {"title":"Java从入门到放弃","authors":["张三"]}

如果参数是函数,传入的函数接收两个参数,属性名和属性值,根据属性名可以知道如何处理属性。属性名是字符串,属性值并非键值对的值,键名可以是空字符串。

返回的值是相应键的值,如果函数返回undefined,那么该属性就会被忽略。

var book = {
"title":"Java programming",
"authors":[
"张三",
"李四"
],
edition: 2
};
var jsonText = JSON.stringify(book, function (key, value) {
switch (key) {
case "authors":
return value.join("-"); // 用“-”分割数组
case "edition":
return undefined;
default :
return value;
}
});
console.log(jsonText); // {"title":"Java programming","authors":"张三-李四"}

字符串缩进

JSON.stringify()的第三个参数用于控制结果中的缩进和空白符。如果是数值,表示每格缩进的空格数。

var book = {
"title":"Java programming",
"authors":[
"萧萧弈寒",
],
edition: 2
};
var jsonText = JSON.stringify(book, null, 4);
console.log(jsonText);

如果是字符串,这个字符串将用作JSON字符串的缩进符

var book = {
"title":"Java programming",
"authors":[
"萧萧弈寒",
],
edition: 2
};
var jsonText = JSON.stringify(book, null, "__");
console.log(jsonText);

【显示结果】:

{
__"title": "Java programming",
__"authors": [
____"萧萧弈寒"
__],
__"edition": 2
}

缩进字符串最多只能包含10个字符。

toJSON()方法

JSON.stringify()并不能满足所有对象进行序列化的需求。可以给对象定义toJSON()方法,返回其自身的JSON数据格式。

示例:

var book = {
"title":"Java programming",
"authors":[
"萧萧弈寒",
],
edition: 2,
toJSON: function () {
return "==="+this.title+"===";
}
};
var jsonText = JSON.stringify(book);
console.log(jsonText); // "===Java programming==="

解析选项

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。如果返回undefined,表示从结果中删除相应的键,如果返回其他值,则将该值插入到结果中。

var book = {
"title":"Java programming",
"authors":[
"萧萧弈寒",
],
edition: 2,
year: 2017,
releaseDate: new Date(2017, 11, 1)
};
var jsonText = JSON.stringify(book); var newBook = JSON.parse(jsonText, function (key, value) {
if (key == "releaseDate") {
return new Date(value);
} else {
return value;
}
});
console.log(newBook.releaseDate.getFullYear()); // 2017

上面新增了releaseDate属性,该属性保存着一个Date对象。经过序列化后,变成了一个有效的JSON字符串,然后又在newBook中还原成一个Date对象。

作者:萧萧弈寒
本文版权归作者萧萧弈寒和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

JavaScript:JSON的更多相关文章

  1. JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString

    JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString 如下示例: 直接写的a1就是一个Json对象,a2 就是一个Json对象字符串; 通 ...

  2. JavaScript JSON timer(计时器) AJAX HTTP请求 同源策略 跨域请求

    JSON 介绍 1. JSON: JavaScript Object Notation 是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是 ...

  3. JavaScript -- JSON.parse 函数 和 JSON.stringify 函数

    JavaScript -- JSON.parse 函数 和 JSON.stringify 函数 1. JSON.parse 函数: 使用 JSON.parse 可将 JSON 字符串转换成对象. &l ...

  4. 细读 php json数据和JavaScript json数据

    关于JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量级数据格式,占用字符数量极少,特别适合互联网传递: 4.可读性较强 5.容 ...

  5. JavaScript JSON AJAX 同源策略 跨域请求

    网页和Ajax和跨域的关系 1 Ajax使网页可以动态地.异步地的与服务器进行数据交互,可以让网页局部地与服务器进行数据交互 2 Ajax强调的是异步,但是会碰到跨域的问题. 3 而有很多技术可以解决 ...

  6. javascript.json snippets vscode 注释

    vscode vue js里面的注释 javascript.json { // Place your global snippets here. Each snippet is defined und ...

  7. javascript json写法

    javascript json写法 var shuxing = {name:"super",sex:"19",work:"IT"}; 这个k ...

  8. JavaScript JSON 与 AJAX

    JavaScript JSON 与 AJAX JSON 是一种轻量的数据交互格式,与 AJAX 配合完成前端页面与服务端的信息传递,本文介绍 JSON 的使用.原生 AJAX 写法.JSONP 跨域解 ...

  9. javascript json字符串与对象相互转换

    在实际项目中,经常遇到字符格式的问题,记下来以便日后方便查看.用到两个函数:JSON.stringify() 和 JSON.parse(). 使用ajax向后台请求数据,后台给前端返回数据,明明后端脚 ...

  10. Sublime Text插件:HTML+CSS+JAVASCRIPT+JSON快速格式化[转]

    今天在github上乱逛,无意间找到victorporof分享的htmlpretty插件,特做推荐: 先看看他是怎么描述htmlpretty的: This is a Sublime Text 2 an ...

随机推荐

  1. 从零开始学习Node.js例子七 发送HTTP客户端请求并显示响应结果

    wget.js:发送HTTP客户端请求并显示响应的各种结果 options对象描述了将要发出的请求.data事件在数据到达时被触发,error事件在发生错误时被触发.HTTP请求中的数据格式通过MIM ...

  2. Java数据结构和算法之递归

    四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mo ...

  3. 一个简单的linux线程池(转-wangchenxicool)

    线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...

  4. springMvc源码学习之:spring源码总结

    转载自:http://www.cnblogs.com/davidwang456/p/4213652.html spring beans下面有如下源文件包: org.springframework.be ...

  5. Maven学习5-聚合与继承

    一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...

  6. JS获取当前日期时间及JS日期格式化

    Js获取当前日期时间: var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份( ...

  7. plsql登录找不到可连接数据库

    环境: OS:server 2008r2 64位 现象: plsql安装完成后,登录时数据库下拉列表为空,但主目录和oci库都能正常检测到. 原因: 系统环境变量未设置. 解决: 设置系统环境变量.t ...

  8. 关闭和开启oracle

    1.使用sqlplus 启动和关闭数据库. 答:使用sqlplus以sysdba的身份登录数据库 因为我的数据库是启动状态,所以我就先演示数据库的关闭 数据库的关闭使用语句shutdown immed ...

  9. 详细安装ss的过程(vultr)

    #更新程序yum update -y #安装setuptoolsyum install -y python-setuptools #安装pipeasy_install pip #安装shadowsoc ...

  10. datatable list 之前相互转换

    使用 FastMember: IEnumerable<SomeType> data = ... DataTable table = new DataTable(); using(var r ...