天天看點

JSON學習筆記-你不知道的JSONJSON學習筆記-你不知道的JSON

JSON學習筆記-你不知道的JSON

文章目錄

  • JSON學習筆記-你不知道的JSON
      • 什麼是JSON
      • JSON 與 XML 差別
      • JSON的基礎資料類型
        • 1. JSON 數字
        • 2.JSON 對象
        • 3.JSON 數組
        • 4. JSON 布爾值
        • 5. JSON null
      • JSON 中的一些轉義問題
      • JSON SCHEMA
      • 服務端的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 值:

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 .

JSON學習筆記-你不知道的JSONJSON學習筆記-你不知道的JSON

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