JSON学习笔记-你不知道的JSON

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 这个库关注量比较多.

josn schema step by step

Implementations

服务端的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 .

img

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必知必会书籍

mdn json

runnoob json

w3school json

在线学习网址runoob

python模块的使用 json模块

分享快乐,留住感动. '2021-07-03 10:45:21' --frank
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值