golang 網路程式設計(10)文字處理

golang_real.jpg
Json 處理
現在大部分我們從服務端獲取資料都是Json 格式,所以對 json 格式資料處理在 web 應用開發中顯得至關重要。有關 json 我想大家再熟悉不過了,這裡就簡單地提一句,json 就是一種輕量級的資料交換語言。儘管 json 是 javascript 的一個子集,但 json 是獨立於語言的文字格式。
{ "data":[ { "title":"angular base tut", "author":"zidea" } ] }
定義與上面 Json 資料對應的結構體 Tut
和 TutReponse
少寫一個字母。json 陣列對應 go 語言中 slice
。
這裡結構 struct 的欄位需要大寫,如果 json 欄位多於結構體,找不到對應欄位就會被忽略。
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 的函式,接受 []byte 和表示任意型別介面作為引數,所以我們的 json 需要轉為 []byte 才能使用。
func Unmarshal(data []byte, v interface{}) error
因為 interface{} 可以表示任何型別的物件,這正和解析 json 的未知資料結構,在 Json 包中採用map[string]interface{} 和 []interface{} 結構來儲存任意的 Json 物件和陣列
- 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]]
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," isof a type ") } }
map[age:30 lang:[java javascript go cpp rust] name:zidea] name is string zidea ageisof a type langis 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)
輸入一個結構體返回位元組陣列。

th-9.jpeg