飞道软件工厂

插件式开发

JSON

定义

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

摘自百度百科

这是一种轻量级的数据交换格式,大约在2000年以前,大家在进行数据交换的时候基本上都是使用xml

相比较xml,JSON一个最大的优势就是非常直观易读。现在基本上进行数据传输的时候大家都会倾向于使用JSON格式。

发音

正确的发音为计诶斯恩

误解

json=js对象

不少人实际上并没有搞清楚json和js对象的差别。其实记住一条就行:json只是一个字符串

json={}

也有不少人对json有误解,认为json只能转换为带花括号的键值对,至少最外层必须是。事实上,json几乎可以是任何js类型,包括:

  1. Object
  2. Array
  3. string
  4. number
  5. boolean

其中,Object和Array是最常用的两种类型

以下两种类型(如果你认为这是两种类型的话)是不能在json中被使用的,注意,这里并非指的是jsObject的值类型,而是整个js对象的值。

  1. undefined
  2. NaN

JSON中的数据类型

字符串

"Hello"

数值

123

布尔类型

true
false

对象

{"foo":"bar"}

数组

["foo","bar",true,1,2,3]

日期

日期类型不属于JSON中的数据类型,之所以在这里列出,是因为JSON中的数据类型与开发语言以及数据库的字段类型中常见的数据类型相比,这个类型是没有的,那么,我们如何传输数据类型呢?

一种相对较通用的方式是在数据设计中不要使用日期类型,JSON中缺少日期类型是其中一个原因,当然还有另外的原因,比如不同的数据库的日期类型会有不同,如果要进行数据库迁移的话,这会是个相对麻烦的事。不使用日期类型使用什么呢,当然是使用时间戳了。时间戳是一个长整型,而这种类型无论是开发语言,数据库还是JSON,都是支持的。各开发语言中也都可以非常方便地把时间戳转换为日期类型或是需要显示的日期格式(通常是个字符串)。

从对象转换为 JSON 字符串

复制以下例子,在node命令行或浏览器中均可以看到结果

JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'

从 JSON 转换为对象

JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}

之所以很多JavaScript开发人员搞不清楚js对象和JSON字符串的关系是因为它们长地太像了。从以上例子可以看得出来。

转换方法

js对象 => json

JSON.stringify({}); JSON.stringify([]); JSON.stringify("abc"); JSON.stringify(123); JSON.stringify(true);

json => js对象

JSON.parse("{}"); JSON.parse("[]"); JSON.parse("\"abc\""); JSON.parse("123"); JSON.parse("true");

提示

  1. 千万不要以为json和js对象的转换很简单,自作聪明去拼字符串。
  2. 千万不要使用eval替换JSON.parse

工具

有时候我们为了查看一个json的格式,需要用到一些工具。比如在windows上的xmlspy,对于开发人员来说,几乎任意一款编辑器都可以方便地格式化json,像vscode,对json可以很方便地格式化。

如果这些你都没有怎么办?只要有网络,网上在线解析json的网站一搜一大把。如果你的电脑上不了网怎么办?借助浏览器开发工具,相信多数人都会使用浏览器的吧,不管你上不上网,基本都会有,比如谷歌或是基于chrome内核的一些国产浏览器如qq浏览器,360浏览器等,都可以找到开发工具并打开,在控制台将字符串粘进去回车,就可以看到格式化好的对象了,是不是很方便?

json vs xml

不用比,适合你的就是最好的,打架没必要,世人自有公论,真想了解的话,到这里找