JSON学习笔记-你不知道的JSON
文章目录
什么是JSON
JSON 本质上就是一种 “数据交换格式” . 用json 这种数据格式 就可以和不同的系统 进行通信,相互交流. 它的目标就是完成数据交换. JSON 本身不属于任何一门编程语言,只是一种表现形式.
JSON 全称 Javascript Object Notation (Javascript 对象表示法) , 看到这个名字,很多人以为要学习JavaScript 这们语言 也能学习JSON, 其实这两个没有关系. JavaScript 本身 是前端的一种前端编程语言. JSON 是一种数据表示方法. 二者几乎没有关系.
JSON 与 XML 区别
在听到 JSON 这种数据交换格式之前, 你可能 还听过 XML , xml 本身 设计也是用来传输数据的.
XML 指可扩展标记语言(eXtensible Markup Language)
- XML 的设计宗旨是传输数据,而不是显示数据。
- XML 传输的数据具有自描述性
那么 为啥 还会出现JSON 不直接使用 XML 这种格式进行传输和保存数据呢?
我给出我的一些个人观点,不一定对,可以一起讨论.
-
我感觉JSON 表示一种类型 字符比较少, 不需要创建一组标签来完成闭合,而使用
{}
来完成 数据的表示. -
JSON 比 XML 更小、更快,更易解析.
-
JSON 很多后端语言都给予的支持 python ,java, go ,Php, Node.js 这些 语言都已经有相当完善的库,进行解析json 的数据.
对应xml:
<bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
对应json 表示如下:
{
"bookstore": [
{
"category": "CHILDREN",
"book": {
"title": "Harry Potter",
"author": "J K. Rowling",
"year": 2005,
"price": 29.99
}
},
{
"category": "WEB",
"book": {
"title": "Learning XML",
"author": "Erik T. Ray",
"year": 2003,
"price": 39.95
}
}
]
}
目前web api 后端 与前端 进行数据传输 很多使用的就是json 这种数据格式. 之前比较旧的系统 可能还是 xml传输数据.
什么是 JSON ?
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
- JSON 具有自我描述性,更易理解
JSON - 转换为 JavaScript 对象
JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。
由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象。
JSON的基础数据类型
JSON 有基础的六大数据类型 , 分别是 数字,对象, 字符串,数组,布尔值 ,null
JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
JSON 名称/值对 或者 叫 键值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号 :
,然后是值:
注意这里名称 必须用 双引号 括起来, 不能使用单引号.
{"name" : "菜鸟教程"}
一 JSON 值
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false) (小写)
- 数组(在中括号中)
- 对象(在大括号中)
- null
JSON 的名称 或者 键 只能是字符串类型, 这里的字符串,要用双引号括起来
1. JSON 数字
JSON 数字可以是整型或者浮点型:
{ "age":30 }
2.JSON 对象
JSON 对象在大括号({})中书写:
对象可以包含多个名称/值对:
注意最后一个键值对 没有逗号 , 并且所有的键 都必须使用 双引号括起来 “” ,不能使用 单引号!!!
key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
{ "name":"菜鸟教程" , "url":"www.runoob.com" }
{
"_id" : ObjectId("5912cf60d616df3117e92541"),
"mobile" : "11116526716",
"name" : "小明",
"id_card_number" : "320110180510158775",
"created_time" : "2017-05-10 16:29:19.886",
"Rule_final_weight" : "0",
"code" : "100002",
"flag_specialList_c" : "0",
"swift_number" : "304591320170510_162919_7005",
"return_time" : "2017-05-10 16:29:20.011",
"Rule_final_decision" : "Accept",
"flag_rulespeciallist" : "0"
}
3.JSON 数组
JSON 数组在中括号中书写:
数组可包含多个对象:
JSON 数组在中括号中书写。
JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
{
"call_record": [{
"date": "2019-05-15 14:47:00",
"duration": "28",
"number": "12004560761",
"type": "INCOMING"
},
{
"date": "2017-03-15 15:56:32",
"duration": "9",
"number": "02180341912",
"type": "INCOMING"
},
{
"date": "2017-03-15 16:33:50",
"duration": "199",
"number": "18011230001",
"type": "INCOMING"
},
{
"date": "2017-07-02 08:29:11",
"duration": "0",
"number": "12580",
"type": "OUTGOING"
},
{
"date": "2017-07-02 08:29:22",
"duration": "40",
"number": "10010",
"type": "OUTGOING"
}
]
}
如果数组中有多个元素 需要用逗号隔开, 最后一个元素后面不要添加逗号. 下面的例子 frank 后面没有逗号.
[
"Taobao",
"Charley",
"frank"
]
如果数组中只有一个元素, 不需要添加逗号.
[
"Taobao"
]
来看下另一个例子
{
"name": "网站",
"sites": ["Google", "Runoob", "Taobao"]
}
另一个例子数组 中可以存放字符串,数字,bool值,以及 对象 , 即json 数组里面可以放入任何json的数据类型,不一定要求必须是一种数据类型.
{
"name": "网站",
"sites": ["Google", 12, true, false,
{
"name": "website"
}
]
}
4. JSON 布尔值
JSON 布尔值可以是 true 或者 false
{ "flag":true }
{ "flag":false }
5. JSON null
JSON 可以设置 null 值:
{"created_time":null}
JSON 中的一些转义问题
有的时候我们可能遇到这样的情况 , 我们JSON 中, value 本身包含双引号, 我们知道双引号,是用来包裹你要需要的内容 ,如果本身内容 有双引号, 在 JSON 解析的时候就不知道 该如何解析这段字符串.
比如:下面的body 对应的值, 下面的这段就是错误的 JSON 格式.
{
"title":"hahah",
"body":" This is a sentence. "I am Frank." "
}
为了保证JSON 的正确性 . 我们可以在 value 中双引号的前面 添加 \
这个字符 ,就可以完成对双引号的转义
{
"title":"hahah",
"body":" This is a sentence. \"I am Frank.\" "
}
下面 就是 还有一些特殊字符 如果需要 也要进行转义.
\" 双引号转义
\/ 正斜线
\b 退格符
\f 换页符
\t 制表符
\n 换行符
\r 回车符
\u 后跟十六进制字符 (\u12a3)
JSON SCHEMA
JSON SCHEMA 只是用来验证数据传输数据的合法性. 保证数据传输的时候满足一定的格式.
在不同的系统中 交互数据的时候,就不会产生不必要的麻烦 .
-
值的数据类型是否正确
可以指定值的类型 , 数字, 字符串等.
-
是否包含所需的数据?
规定哪些数据是需要的, 哪些是不需要的
-
值的形式 是不是我需要的?
可以指 值的范围是否合法, max,min 等
通过json-schema 保证了数据的格式,以及类型,数据范围 是满足要求的,这样可以保证 数据在传输的时候的可靠性.
通过编写json-schema 这个文件 来验证json 的数据是否合法, 在python语言里面, 已经有很多已经写好的实现,重点推荐 这个 jsonschema 这个库关注量比较多.
服务端的JSON
当前后端的web开发, 很多与前端交互 发送数据 我们都会使用 json 这种数据类型进行传输.
第一 这种结构 方便,简单.
第二个 本身后端语言已经对json 已经有了很好的 支持.
这里以python 语言 ,使用Flask 框架举例.
下面几行测试代码 ,就可以返回 一个json 的 response
from flask import Flask, request, jsonify
def create_app():
ins = Flask(__name__)
return ins
app = create_app()
@app.route('/book',methods=['GET', 'POST'])
def book():
if request.method == 'GET':
data = {
'author':'frank',
'name':'Flask tutor',
'publish_date':'2021-12-12'
}
return jsonify(data)
通过 jsonify 就可以直接把 python 中的字典数据类型,变成 一个 json response .
JSON 作为配置文件
Node.js 默认的javascript 包管理器:npm
npm 包管理器,可以使用 json 作为配置文件 ,package.json 文件 .这里定义包具体一些 信息 名称,版本,依赖,作者 等信息.
{
"name": "hello world",
"version": "1.0.0",
"scripts": {
"dev": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.5.0",
"element-ui": "^2.10.1",
"json-query": "^2.1.2"
},
"keywords": [
"book",
"frank"
],
"author": "frank.chang"
}
总结
JSON 目前作为一种数据格式, 在不同系统之间交换,传输数据以其方便,起到了举足轻重的作用 .
目前在web后端 开发方向 ,后端的API 几乎都会使用JSON 这种格式 进行传输数据.
JSON 同时也可以作为配置文件来使用.
还有一些 Nosql 使用 JSON来存储数据,本文没有提及 .
当然数据格式有很多种,除了JSON , 还有 xml等. 没有一种数据格式是完美的. 是否选择使用什么的数据,需要根据系统所处的环境,以及改成JSON 需要花费的成本. 有的时候 可能 JSON 并不是最好的选择. 只是本文对JSON 做了很多的介绍,想让大家多多认识这种数据交换格式.
参考文档
JSON必知必会书籍