1. JSON 是什么

JSON,全称是 JavaScript Object Notation,即 JavaScript 对象标记法。这是一种轻量级(Light-Weight)、基于文本的(Text-Based)、可读的(Human-Readable)格式。

JSON 的名称中虽然带有 JavaScript,但这是指其语法规则是参考 JavaScript 对象的,而不是指只能用于 JavaScript 语言。实际上很多语言(如 C++、Java、PHP 等)都配有 JSON 的解析和生成器。

JSON 无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML (另一种常见的数据交换格式),文件更小,因此迅速成为网络上十分流行的交换格式。

2. JSON 的语法规则

  1. 数组(Array)用方括号(“[]”)表示。
  2. 对象(Object)用大括号(”{}”)表示。
  3. 名称/值对(name/value)之间用冒号(”:”)隔开。
  4. 名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。
  5. 并列的数据之间用逗号(“,”)分隔
  6. 数组或对象的每个成员的值,可以是简单值,也可以是复合值

需要注意的是,空数组和空对象都是合格的JSON值,null本身也是一个合格的JSON值。

简单案例:

//描述学生信息的案例
{
"name":"zhangsan",
"age":23,
"sex":"male",
"class":"Computer Science",
"studentNumber":"20120101",
course:[
{courseNo:"2015001","courseName":"数据结构",teacherName":"Lisi"},
{courseNo:"2015002","courseName":"数据库原理",teacherName":"Wangwu"}
]
}

3. JSON 和 XML

JSON 常被拿来与 XML 做比较,因为 JSON 的诞生本来就多多少少要有取代 XML 的意思。相比 XML,JSON 的优势如下:

  • 没有结束标签,长度更短,读写更快
  • 能够直接被 JavaScript 解释器解析
  • 可以使用数组

下面是描述同样信息的 XML 文件和 JSON 文件,来看看区别。JSON:

{
"name": "Geoff Lui",
"age": 26,
"isChinese": true,
"friends":["Lucy", "Lily", "Gwen"]
}

XML:

<root>
<name>Geoff Lui</name>
<age>Geoff Lui</age>
<friends>Lucy</friends>
<friends>Lily</friends>
<friends>Gwen</friends>
</root>

可以看到,描述同样的信息,XML 更加麻烦,而 JSON 要轻巧得多,在有数组出现的情况下更加明显。而且,当数组项很多的时候,XML 文件中的大量信息都被用于描述没什么用的标签上了。

但是,绝不是说 XML 就一无是处,要完全放弃,归根结底还是要看有怎样的开发要求。

4.JSON对象

处理JSON格式的数据。它有两个方法:JSON.stringify和JSON.parse。

4.1、stringify()

JSON.stringify方法用于将一个值转为字符串。该字符串符合JSON格式,并且可以被JSON.parse方法还原。

JSON.stringify("somestring") // "somestring"
JSON.stringify(1) // "1"
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}" JSON.stringify([1, "false", false])
// '[1,"false",false]' JSON.stringify({ "name": "张三" })
// '{"name":"张三"}'

需要注意的是,对于原始类型的字符串,转换结果会带双引号,即字符串somestring会被转成"somestring",这是因为将来还原的时候,双引号可以让JavaScript引擎知道,abc是一个字符串,而不是一个变量名。

如果原始对象中,有一个成员的值是undefined、函数或XML对象,这个成员会被省略。如果数组的成员是undefined、函数或XML对象,则这些值被转成null。

JSON.stringify({
f : function () {},
a : [function () {}, undefined]
});
// "{"a":[null,null]}"

JSON.stringify方法会忽略对象的不可遍历属性。

var obj = {};
Object.defineProperties(obj, {
'foo': {
value: 1,
enumerable: true
},
'bar': {
value: 2,
enumerable: false
}
}); JSON.stringify(obj); // {"foo":1}

JSON.stringify方法还可以接受一个数组参数,指定需要转成字符串的属性。

console.log(JSON.stringify({ name:"zhangsan", age:22 }, ['name']));
// {"name":"zhangsan"}

JSON.stringify方法还可以接受一个函数作为参数,用来更改默认的字符串化的行为。

function f(key, value) {
if (typeof value === "number") {
value = 2 * value;
}
return value;
} JSON.stringify({ a:1, b:2 }, f)
// '{"a":2,"b":4}'

JSON.stringify还可以接受第三个参数,用于增加返回的JSON字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。

JSON.stringify({ p1:1, p2:2 }, null, 2);
// "{
"p1": 1,
"p2": 2
}" JSON.stringify({ p1:1, p2:2 }, null, "|-");
// "{
|-"p1": 1,
|-"p2": 2
}"

如果JSON.stringify方法处理的对象,包含一个toJSON方法,则它会使用这个方法得到一个值,然后再将这个值转成字符串,而忽略其他成员。

JSON.stringify({
toJSON: function() {
return "Cool"
}
})
// "Cool"" var o = {
foo: 'foo',
toJSON: function() {
return 'bar';
}
};
var json = JSON.stringify({x: o});
// '{"x":"bar"}'

toJSON方法的一个应用是,可以将正则对象自动转为字符串。

RegExp.prototype.toJSON = RegExp.prototype.toString;

JSON.stringify(/foo/)
// "/foo/"

4.2、JSON.parse()

JSON.parse方法用于将JSON字符串转化成对象。

JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null var o = JSON.parse('{"name":"张三"}');
o.name // 张三

如果传入的字符串不是有效的JSON格式,JSON.parse方法将报错。为了处理解析错误,可以将JSON.parse方法放在try...catch代码块中。

JSON.parse方法可以接受一个处理函数,用法与JSON.stringify方法类似。

function f(key, value) {
if ( key === ""){
return value;
}
if ( key === "a" ) {
return value + 10;
}
} var o = JSON.parse('{"a":1,"b":2}', f);
o.a //
o.b // undefined
  1. 参考链接:JSON.parse()
  2. 阮一峰的教程

Json杂谈系列------(一)初始json的更多相关文章

  1. Json.Net系列教程 3.Json.Net序列化和反序列化设置

    原文 Json.Net系列教程 3.Json.Net序列化和反序列化设置 上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framewo ...

  2. Json.Net系列教程 1.Json.Net介绍及实例

    原文 Json.Net系列教程 1.Json.Net介绍及实例 本系列教程假设读者已经对Json有一定的了解,关于Json在这里不多说.本系列教程希望能对读者开发涉及到Json的.Net项目有一定的帮 ...

  3. Json.Net系列教程 4.Linq To JSON

    原文 Json.Net系列教程 4.Linq To JSON 更改历史 2013-05-31 添加一个FAQ   一.Linq to JSON是用来干什么的? Linq to JSON是用来操作JSO ...

  4. Json.Net系列教程 2.Net类型与JSON的映射关系

    原文 Json.Net系列教程 2.Net类型与JSON的映射关系 首先谢谢大家的支持和关注.本章主要介绍.Net类型与JSON是如何映射的.我们知道JSON中类型基本上有三种:值类型,数组和对象.而 ...

  5. json教程系列(1)-使用json所要用到的jar包下载

    json是个非常重要的数据结构,在web开发中应用十分广泛.我觉得每个人都应该好好的去研究一下json的底层实现,基于这样的认识,金丝燕网推出了一个关于json的系列教程,分析一下json的相关内容, ...

  6. mybatis&plus系列------Mysql的JSON字段的读取和转换

    mybatis&plus系列------Mysql的JSON字段的读取和转换 一. 背景 在平常的开发中,我们可能会有这样的需求: 业务数据在存储的时候,并不是以mysql中的varchar丶 ...

  7. json学习系列(6)JSONObject和JSONArray是JDK的集合部分延伸

    我一直觉得JSONObject和JSONArray是JDK集合部分的延伸,它们与JDK的List和Map一脉相承.通过研究JSONObject和JSONArray的结构,我们顺便也复习一下JDK的内容 ...

  8. json学习系列(3)-JSONObject的过滤设置

    我们通常对一个json串和java对象进行互转时,经常会有选择性的过滤掉一些属性值.例如下面的实体类: package com.pcitc.json; /** * Person实体类 * * @Des ...

  9. Java入门系列:处理Json格式数据

    本节主要讲解: 1)json格式数据处理方法 2)第三方工具包的使用方法 3)java集合数据类型 [项目任务] 编写一个程序,显示未来的天气信息. [知识点解析] 为了方便后面代码的分析,先需要掌握 ...

随机推荐

  1. EF中使用Linq时First、FirstOrDefault、Single、SingleOrDefault几个方法的区别

    在使用EntityFramework开发时,.NET的System.Linq.Enumerable类为我们提供了许多Linq方法. 给大家分享一下关于First.FirstOrDefault.Sing ...

  2. 创建展开行明细编辑表单的 CRUD 应用

    http://www.runoob.com/jeasyui/jeasyui-app-crud3.html jQuery EasyUI 应用 - 创建展开行明细编辑表单的 CRUD 应用 当切换数据网格 ...

  3. 康托展开&逆展开算法笔记

    康托展开(有关全排列) 康托展开:已知一个排列,求这个排列在全排列中是第几个 康托展开逆运算:已知在全排列中排第几,求这个排列 定义: X=an(n-1)!+an-1(n-2)!+...+ai(i-1 ...

  4. HDU 2612 Find a way【多起点多终点BFS/两次BFS】

    Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. Lock wait timeout exceeded数据库死锁问题

    环境 MySQL5.5 现象 A.数据更新或新增后数据经常自动回滚. B.表操作总报 Lock wait timeout exceeded 并长时间无反应 解决方法 A.应急方法:show proce ...

  6. usaco1.4.3等差数列

    为这道苟题鼓掌 题目: 一个等差数列是一个能表示成a, a+b, a+2b,…, a+nb (n=0,1,2,3,…)的数列.在这个问题中a是一个非负的整数,b是正整数.写一个程序来找出在双平方数集合 ...

  7. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  8. 洛谷——P2421 A-B数对(增强版)

    题目背景 woshiren在洛谷刷题,感觉第一题:求两数的和(A+B Problem)太无聊了,于是增加了一题:A-B Problem,难倒了一群小朋友,哈哈. 题目描述 给出N 个从小到大排好序的整 ...

  9. 安装mongodb插件

    1.安装mngodb模块 wget http://pecl.php.net/get/mongodb-1.2.4.tgz tar zxf mongodb-1.2.4.tgz cd mongodb-1.2 ...

  10. [Contest20180313]灵大会议

    为了方便才用lct,没想到最后要加读入优化才能过... 有一个结论就是在一条链上,如果能找到一个点使得这个点划分链左右两边的树节点权值和最相近,那么这个点就是答案 用lct维护,每个splay节点存树 ...