Json 處理
現(xiàn)在大部分我們從服務(wù)端獲取數(shù)據(jù)都是Json 格式绍撞,所以對 json 格式數(shù)據(jù)處理在 web 應(yīng)用開發(fā)中顯得至關(guān)重要露戒。有關(guān) json 我想大家再熟悉不過了硕旗,這里就簡單地提一句争舞,json 就是一種輕量級的數(shù)據(jù)交換語言士修。盡管 json 是 javascript 的一個子集枷遂,但 json 是獨立于語言的文本格式。
{
"data":[
{
"title":"angular base tut",
"author":"zidea"
}
]
}
定義與上面 Json 數(shù)據(jù)對應(yīng)的結(jié)構(gòu)體 Tut
和 TutReponse
少寫一個字母棋嘲。json 數(shù)組對應(yīng) go 語言中slice
酒唉。
這里結(jié)構(gòu) struct 的字段需要大寫,如果 json 字段多于結(jié)構(gòu)體沸移,找不到對應(yīng)字段就會被忽略黔州。
type Tut struct{
Title string
Author string
}
type TutReponse struct{
Data []Tut
}
package main
import(
"encoding/json"
"fmt"
)
type Tut struct{
Title string
Author string
}
type TutReponse struct{
Data []Tut
}
func main() {
var tuts TutReponse
str := `{"data":[{"title":"angular base tut","author":"zidea"}]}`
json.Unmarshal([]byte(str),&tuts)
fmt.Println(tuts)
}
json.Unmarshal([]byte(str),&tuts)
這是解析 json 的函數(shù)耍鬓,接受 []byte 和表示任意類型接口作為參數(shù),所以我們的 json 需要轉(zhuǎn)為 []byte 才能使用流妻。
func Unmarshal(data []byte, v interface{}) error
因為 interface{} 可以表示任何類型的對象牲蜀,這正和解析 json 的未知數(shù)據(jù)結(jié)構(gòu),在 Json 包中采用map[string]interface{} 和 []interface{} 結(jié)構(gòu)來存儲任意的 Json 對象和數(shù)組
- bool 代表 JSON boolean
b := []byte (`{"name":"zidea","age":30,"lang":["java","javascript","go","cpp","rust"]}`)
var f interface{}
err := json.Unmarshal(b, &f)
if err != nil{
log.Fatal("json encoding:",err)
}
fmt.Println(f)
map[name:zidea age:30 lang:[java javascript go cpp rust]]
用之前我們學(xué)習(xí)有關(guān) map 和接口類型推斷知識來手動解析一下這個 json
golang 基礎(chǔ)(16)map
golang 基礎(chǔ)(20)接口
m := f.(map[string]interface{})
for k, v := range m{
switch vv := v.(type){
case string:
fmt.Println(k, "is string", vv)
case int:
fmt.Println(k," is int ",vv)
case []interface{}:
fmt.Println(k," is an arry:")
for i, u := range vv{
fmt.Println(i,u)
}
default:
fmt.Println(k," is of a type ")
}
}
map[age:30 lang:[java javascript go cpp rust] name:zidea]
name is string zidea
age is of a type
lang is an arry:
0 java
1 javascript
2 go
3 cpp
4 rust
生成 Json
package main
import(
"encoding/json"
"fmt"
)
type Tut struct{
Title string
Author string
}
type TutResponse struct{
Data []Tut
}
func main() {
var tutResponse TutResponse
tutResponse.Data = append(tutResponse.Data, Tut{Title:"vuejs basic tut",Author:"zidea"})
b, err := json.Marshal(tutResponse)
if err != nil {
fmt.Println("json err:", err)
}
fmt.Println(string(b))
}
b, err := json.Marshal(tutResponse)
輸入一個結(jié)構(gòu)體返回字節(jié)數(shù)組绅这。