golang struct 定義中json``解析說明

在代碼學習過程當中,發現struct定義中能夠包含`json:"name"`的聲明,因此在網上找了一些資料研究了一下golang

package main

import (
    "encoding/json"
    "fmt"
)

//在處理json格式字符串的時候,常常會看到聲明struct結構的時候,屬性的右側還有小米點括起來的內容。`TAB鍵左上角的按鍵,~線同一個鍵盤`

type Student struct {
    StudentId      string `json:"sid"`
    StudentName    string `json:"sname"`
    StudentClass   string `json:"class"`
    StudentTeacher string `json:"teacher"`
}

type StudentNoJson struct {
    StudentId      string
    StudentName    string
    StudentClass   string
    StudentTeacher string
}

//能夠選擇的控制字段有三種:
// -:不要解析這個字段
// omitempty:當字段爲空(默認值)時,不要解析這個字段。好比 false、0、nil、長度爲 0 的 array,map,slice,string
// FieldName:當解析 json 的時候,使用這個名字
type StudentWithOption struct {
    StudentId      string //默認使用原定義中的值
    StudentName    string `json:"sname"`           // 解析(encode/decode) 的時候,使用 `sname`,而不是 `Field`
    StudentClass   string `json:"class,omitempty"` // 解析的時候使用 `class`,若是struct 中這個值爲空,就忽略它
    StudentTeacher string `json:"-"`               // 解析的時候忽略該字段。默認狀況下會解析這個字段,由於它是大寫字母開頭的
}

func main() {
    //NO.1 with json struct tag
    s := &Student{StudentId: "1", StudentName: "fengxm", StudentClass: "0903", StudentTeacher: "feng"}
    jsonString, _ := json.Marshal(s)

    fmt.Println(string(jsonString))
    //{"sid":"1","sname":"fengxm","class":"0903","teacher":"feng"}
    newStudent := new(Student)
    json.Unmarshal(jsonString, newStudent)
    fmt.Println(newStudent)
    //&{1 fengxm 0903 feng}
    //Unmarshal 是怎麼找到結構體中對應的值呢?好比給定一個 JSON key Filed,它是這樣查找的:
    // 首先查找 tag 名字(關於 JSON tag 的解釋參看下一節)爲 Field 的字段
    // 而後查找名字爲 Field 的字段
    // 最後再找名字爲 FiElD 等大小寫不敏感的匹配字段。
    // 若是都沒有找到,就直接忽略這個 key,也不會報錯。這對於要從衆多數據中只選擇部分來使用很是方便。

    //NO.2 without json struct tag
    so := &StudentNoJson{StudentId: "1", StudentName: "fengxm", StudentClass: "0903", StudentTeacher: "feng"}
    jsonStringO, _ := json.Marshal(so)

    fmt.Println(string(jsonStringO))
    //{"StudentId":"1","StudentName":"fengxm","StudentClass":"0903","StudentTeacher":"feng"}

    //NO.3 StudentWithOption
    studentWO := new(StudentWithOption)
    js, _ := json.Marshal(studentWO)

    fmt.Println(string(js))
    //{"StudentId":"","sname":""}

    studentWO2 := &StudentWithOption{StudentId: "1", StudentName: "fengxm", StudentClass: "0903", StudentTeacher: "feng"}
    js2, _ := json.Marshal(studentWO2)

    fmt.Println(string(js2))
    //{"StudentId":"1","sname":"fengxm","class":"0903"}

}

 

 

參考:json

GO語言JSON簡介ide

相關文章
相關標籤/搜索