深入浅出认识和理解JSON

回复 星标
更多

深入浅出认识和理解JSON

JSON可以说是互联网中轻量级的数据交互格式,特别是在前后端设计分离和微服务架构下的Restful API的风行,更让JSON成了一种IT软件中的标配。json不复杂,很容易搞懂。你且看本文简明扼要的的说给你听。

510974

JSON数据表示的LOGO

1.1 JSON总览

JSON (JavaScript Object Notation,即JavaScript对象表示法)是一种轻量级的数据交换格式。它是人类易于读写的、也便于机器很解析和生成。它构建于JavaScript编程语言标准ECMA-262第三版(1999年12月)的一个子集之上。JSON是一种完全独立于语言的文本格式,但使用了C语言家族(包括C, C++, C#, Java, JavaScript, Perl, Python和许多其他语言)程序员熟悉的规约。这种格式的一些特性使JSON成为一种理想的数据交换语言。

JSON构建于两种形式的存在

1)名称/值对的集合形式。在各种语言中,这种形式以对象、记录、结构体、字典、哈希表、键列表或关联数组来实现。

2)有序的值列表形式。在大多数语言中,这种形式是以数组、向量、列表或序列的形式实现的。

这些是通用的数据结构。实际上,所有现代编程语言都以这样或那样的形式支持这些结构。基于这种格式的可在编程语言间交互这种数据,其意义是非常重要的。

在JSON中,这两种格式形式化表示如下:

其一,对象的表示:一组无序的名/值对。对象以{左大括号开始,以}右大括号结束。每个名称后面跟着( : )冒号,名/值对之间用(,)逗号分隔。JSON数据的元素图例如下:

510974

JSON元素构成

说明:上图的一个json对象表示含义应该很容易看懂,即左大括号{后跟空格(whitespace),然后是名称字符串(string),再跟空白符(whitespace),然后是冒号(:),其后为名值对的值。若有多个名值对,则名值对间用逗号(,)分隔,然后是新的遵照前面格式要求的名值对元素体。直到最后名值对结束。最后的元素体后就不需要逗号了。其数据样例格式如下所示:

{ name1:value1, name2:value2,…}

其二,值集的表示:以数组(array)存在的值的有序集合。数组以左括号 [ 开始,以右括号 ] 结束。其值之间用逗号,分隔。数组类型JSON值集元素图例如下:

510974

JSON的数组格式

说明:上图数组有序值集的表示含义,很容易看懂,,即以[左中括号开始,然后是元素值value,然后是空白符(whitespace),接着是值元素间的分隔符逗号(,),然后下一个遵循上面表述的值元素。其数据格式的样例表示如下:

[value1 ,value2 ,…]

下面对其以上json表示法中的构成元素进行进一步解释。

1.2值表示(value)

前文json表示中的值(value)可以是双引号中的字符串、数字、true或false或null、对象或数组。这些结构可以嵌套。

JSON数据表示中其值(value)的构成类型如下图示:

510974

JSON数据中值的可能数据类型

也就是说,json对象或数组中的值(value),除了可以是string、number、true、false、null外,还可以是另一个json对象或数组(object 或array)。

1.3字符串表示(string)

对于上面json数据中出现的字符串(string),它是由零个或多个Unicode字符组成的序列,用双引号括起来,可使用反斜杠(\)转义。一个字符表示为单个字符的字符串串。字符串非常类似于C或Java字符串。

1.4数字表示(number)

数字(number)非常类似于C或Java中的数字,只是不使用八进制和十六进制格式。其表示形式如下图所示:

510974

数字明文形式

上图的json数字表示的含义为:数由正负号开始(+忽略,-表示负数)、1-9数字开始,然后是0-9任意数字串构成整数部分,加上小数部分构成(如果有小数)。如果数是小数,则需要有点号(.)然后是小数部分值,可由0-9数字构成的数字串表示。数值也可用科学计数法表示,比如123.0123可表示为1.230123e2,0.0123记为1.23e-2,e大小写皆可,表示以10为底的指数。1.23e-2为1.23*10-2(10的负2次方)。

1.5空白符表示(whitespace)

可以在任何一对符号之间插入空白符(whitespace)。除了一些编码细节,可完全描述了其空白符的表达能。空白符表示如下:

510974

JSON空白符的形式化表示

空白符可以是空格符、换行符、回车符或字表符的任意一个或它们的组合。

1.6 JSON示例与总结

1)JSON对象表示:

{ "name": "SoloCui",

"age": 28,

"address": {"country" : "china", "zip-code": "10000"}

}

2)JSON数组表示:

[3, 11, 4, 21, 5, 9, 2, 6]

3)JSON复合表示

{

"people":[

{

"firstName": "Gann",

"lastName":"zhou"

},

{

"firstName":"Jason",

"lastName":"Lee"

}

],

"fromcoutry":"China",

"staydays":15,

"other":false

}

JSON总结

JSON是一个标记符的序列。这套标记符包含六个构造字符字符串数字和三个字面值。通过这组标记符,实现对对象数组数据的JSON序列化表示。

六个构造符:一对大括号( {} )、一对中括号( [] )、冒号( : )、逗号( , ) ;

空白符(whitespace):在这六个构造字符的前或后允许存在无意义的空白符;

三个字面值:false、null、true中的一个,字面值中的英文必须使用小写;

字符串:是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string);

数字:与C和Java的数值类似,只是不用8进制或十六进制表示。

本质上,JSON是格式化了的字符串。

Java中,处理JSON的工具很多,比较流行的是fastjson、gson、jackson等等,都比较优秀,但fastjson爆出重大漏洞,攻击者可使整个业务瘫痪,目前貌似已修复情况,相信ali很方法会进行更多的安全性评估的。本篇教程主要是介绍在Java中jackson的相关实战应用。有时间再全面的介绍一下fastjson——国货还是要严重支持的^_^

此帖已被锁定,无法回复
新窗口打开 关闭