先看百度百科的定義:
JSON (JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式掂榔。它基于 ECMAScript (歐洲計算機協(xié)會制定的js規(guī)范)的一個子集狞甚,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)捌蚊。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言葵袭。 易于人閱讀和編寫蛙酪,同時也易于機器解析和生成缭付,并有效地提升網(wǎng)絡(luò)傳輸效率拆火。
說實話,在第一次看到這段描述的時候宜猜,我根本不知道它想表達(dá)什么泼返,啥是JSON啊,心里完全沒譜姨拥。
本質(zhì)上來說绅喉,JSON就是一個字符串,一個字符串叫乌,一個字符串柴罐!它將變量以字符串的形式進(jìn)行傳遞。
先來講講在一般情況下憨奸,我們怎么傳遞變量革屠,現(xiàn)在假設(shè)我們有三個變量: A=1,B=2,C=3 似芝,那我們在代碼里如何傳遞這3個變量呢那婉,(你可能會納悶:這也算是個問題?)
比如:
let A=1
let B=2
let C=3
Function TEST(P1, P2, P3) {
Console.log (P1, P2, P2)
}
TEST(A, B, C) //打拥澄汀:123
我們直接將A,B,C作為TEST函數(shù)的參數(shù)傳進(jìn)去完事兒详炬,很簡單對吧。
但是寞奸,如果代碼不是用同一種語言寫成的又怎么整呛谜?
比如瀏覽器端(俗稱前端)用Javascript語言,服務(wù)器用PHP或者Java或者Golang寫成枪萄,你怎么把Javascript的一個變量直接傳遞給例如用Golang寫的某個函數(shù)呢隐岛?哈哈,開始撓頭了吧瓷翻。
這時候礼仗,JSON登場了,它的初始定義非常簡單逻悠,就是把各種變量揉在一起變成一個長字符串,
比如A=1, B=2, C=3韭脊,JSON將它串在一起變成這樣:
“{'a': 1,'b': 2,'c': 3}”
這樣童谒,利用傳遞單一字符串的方式,變相地將3個變量都傳遞走了沪羔,對機器而言饥伊,瀏覽器里運行的Javascript只是向后端的服務(wù)器傳遞了一個字符串,不管你后端運行的軟件是什么語言寫成蔫饰,字符串總是可以接收的琅豆,因此迂回地解決了前后端變量交換問題。當(dāng)然篓吁,JSON并非只能用在瀏覽器/服務(wù)器茫因,任何沒辦法直接傳遞變量又需要進(jìn)行數(shù)據(jù)交換的場合,都可以使用JSON杖剪。
1. Javascript 使用JSON
-
將變量打包成JSON字符串
在JS下使用JSON超級簡單冻押,還是用上面的例子:
let data = { a:1, b:2, c:3 } let json = JSON.stringify(data) console.log(json) //輸出 {"a":1,"b":2,"c":3} 這個字符串
然后你通過http也好,ajax也好盛嘿,把json這個字符串傳遞到后端服務(wù)器即可洛巢。
-
將JSON字符串還原為變量
也就是上例的逆操作,可以這樣:
let json = '{"a":1,"b":2,"c":3}' //假設(shè)這串字符串是服務(wù)器發(fā)過來的 let data = JSON.parse(json) console.log(data.a) //輸出:1
-
總結(jié):
JS對象 轉(zhuǎn) JSON字符串:用 JSON.stringify (JS對象)
JSON字符串 轉(zhuǎn) JS對象:用 JSON.parse (json字符串)
2. Golang使用JSON
-
JSON字符串轉(zhuǎn)變量:
方法1:預(yù)先創(chuàng)建結(jié)構(gòu)體來保存從JSON字符串解析過來的數(shù)據(jù)
import "encoding/json" //首先引用json包 type Data struct { A string //注意次兆,在定義結(jié)構(gòu)體的時候稿茉,成員首字母一定要是大寫,否則json包無法訪問 B string C string } var data Data strJson := `{"a": "1","b": "2", "c":"3"}` json.Unmarshal([]byte(strJson), &data) //&符號是取址的意思 fmt.Printf(data.A) //輸出:1
延展閱讀:
Golang中根據(jù)首字母的大小寫來確定可以訪問的權(quán)限。無論是方法名漓库、常量恃慧、變量名還是結(jié)構(gòu)體的名稱,如果首字母大寫米苹,則可以被其他的包訪問糕伐;如果首字母小寫,則只能在本包中使用蘸嘶,可以簡單的理解成良瞧,首字母大寫是公有的,首字母小寫是私有的训唱。
方法2:不創(chuàng)建結(jié)構(gòu)體直接保存數(shù)據(jù)
import "encoding/json" var data map[string]interface{} strJson := `{"a": "1","b": "2", "c":"3"}` json.Unmarshal([]byte(strJson), &data) result := data["a"] fmt.Println(result) //輸出:1
-
變量轉(zhuǎn)成JSON字符串
data := map[string]interface{}{ "a": "1", "b": "2", "c": "3", } strJson, _ := json.Marshal(data) fmt.Println(string(strJson)) //輸出:{"a":"1","b":"2","c":"3"}
-
總結(jié)
JSON字符串轉(zhuǎn)變量 : 用 json.Unmarshal([]byte(JSON字符串), &變量名)
變量轉(zhuǎn)成JSON字符串:用JSON字符串, _ := json.Marshal(變量名)
JSON入門內(nèi)容就講到這褥蚯,當(dāng)然,在真實的環(huán)境中况增,JSON在使用細(xì)節(jié)上不會這么簡單赞庶,但請記住它的本質(zhì),無非是利用字符串方式解決各種平臺之間的數(shù)據(jù)交換的問題澳骤,不用將它想得過于復(fù)雜歧强。