先看百度百科的定義:
JSON (JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結構使得 JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網(wǎng)絡傳輸效率。
說實話,在第一次看到這段描述的時候,我根本不知道它想表達什么,啥是JSON啊,心里完全沒譜。
本質上來說,JSON就是一個字符串,一個字符串,一個字符串!它將變量以字符串的形式進行傳遞。
先來講講在一般情況下,我們怎么傳遞變量,現(xiàn)在假設我們有三個變量: 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) //打?。?23
我們直接將A,B,C作為TEST函數(shù)的參數(shù)傳進去完事兒,很簡單對吧。
但是,如果代碼不是用同一種語言寫成的又怎么整?
比如瀏覽器端(俗稱前端)用Javascript語言,服務器用PHP或者Java或者Golang寫成,你怎么把Javascript的一個變量直接傳遞給例如用Golang寫的某個函數(shù)呢?哈哈,開始撓頭了吧。
這時候,JSON登場了,它的初始定義非常簡單,就是把各種變量揉在一起變成一個長字符串,
比如A=1, B=2, C=3,JSON將它串在一起變成這樣:
“{'a': 1,'b': 2,'c': 3}”
這樣,利用傳遞單一字符串的方式,變相地將3個變量都傳遞走了,對機器而言,瀏覽器里運行的Javascript只是向后端的服務器傳遞了一個字符串,不管你后端運行的軟件是什么語言寫成,字符串總是可以接收的,因此迂回地解決了前后端變量交換問題。當然,JSON并非只能用在瀏覽器/服務器,任何沒辦法直接傳遞變量又需要進行數(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這個字符串傳遞到后端服務器即可。
-
將JSON字符串還原為變量
也就是上例的逆操作,可以這樣:
let json = '{"a":1,"b":2,"c":3}' //假設這串字符串是服務器發(fā)過來的 let data = JSON.parse(json) console.log(data.a) //輸出:1 -
總結:
JS對象 轉 JSON字符串:用 JSON.stringify (JS對象)
JSON字符串 轉 JS對象:用 JSON.parse (json字符串)
2. Golang使用JSON
-
JSON字符串轉變量:
方法1:預先創(chuàng)建結構體來保存從JSON字符串解析過來的數(shù)據(jù)
import "encoding/json" //首先引用json包 type Data struct { A string //注意,在定義結構體的時候,成員首字母一定要是大寫,否則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ù)首字母的大小寫來確定可以訪問的權限。無論是方法名、常量、變量名還是結構體的名稱,如果首字母大寫,則可以被其他的包訪問;如果首字母小寫,則只能在本包中使用,可以簡單的理解成,首字母大寫是公有的,首字母小寫是私有的。
方法2:不創(chuàng)建結構體直接保存數(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
-
變量轉成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"} -
總結
JSON字符串轉變量 : 用 json.Unmarshal([]byte(JSON字符串), &變量名)
變量轉成JSON字符串:用JSON字符串, _ := json.Marshal(變量名)
JSON入門內容就講到這,當然,在真實的環(huán)境中,JSON在使用細節(jié)上不會這么簡單,但請記住它的本質,無非是利用字符串方式解決各種平臺之間的數(shù)據(jù)交換的問題,不用將它想得過于復雜。