Golang結構體序列化與反序列化時默認值的問題


package scripts_stroage

import (
    "encoding/json"
    "fmt"
    "testing"
)

// 反序列化時,如果不傳對應 json里面的字段,就會解析為 對應數據類型的 "零值"
type TestStruct1 struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    IsBoy bool   `json:"is_boy"`
}

// 類型是指針類型
// 序列化時,如果不指定value,就會被解析成 null(json的空值)
//反序列化時,如果不傳對應 json里面的字段,就會解析為 nil
type TestStruct2 struct {
    Name  *string `json:"name"`
    Age   *int    `json:"age"`
    IsBoy *bool   `json:"is_boy"`
}

func TestST1(t *testing.T) {

    // -------------- 序列化測試 ----------------
    // 1、序列化成一個字符串,有默認值
    t1 := TestStruct1{}
    data1, _ := json.Marshal(t1)
    fmt.Printf("data1: %s \n", data1) // {"name":"","age":0,"is_boy":false}

    // 2、序列化成一個字符串,默認都序列化成了 null !!!
    t2 := TestStruct2{}
    data2, _ := json.Marshal(t2)
    fmt.Printf("data2: %s \n", data2) // data2: {"name":null,"age":null,"is_boy":null}

    // -------------- 反序列化測試 ----------------
    fmt.Println("===================================================")
    s := `{"gender":"male"}` // 沒有json指定的字段~
    // 用第一個反序列化 返回:字符串、數字、bool值 的默認值
    var sObj1 TestStruct1
    _ = json.Unmarshal([]byte(s), &sObj1)
    fmt.Println("sRet1: ", sObj1.Name, sObj1.Age, sObj1.IsBoy) // sRet1:   0 false

    // TODO 用第二個反序列化 返回:三個nil!!!因為我們是用指針去反序列化的,指針的默認值就是nil
    var sObj2 TestStruct2
    _ = json.Unmarshal([]byte(s), &sObj2)
    fmt.Println("sRet2: ", sObj2.Name, sObj2.Age, sObj2.IsBoy) // sRet2:  <nil> <nil> <nil>

    // TODO 第二種方法反序列化出來以后,再次賦值,注意只能用變量去設置,因為我們可以取到變量的地址,但是不能獲取常量的地址
    defaultName := "whw"
    defaultAge := 22
    defaultBoy := true
    if sObj2.Name == nil {
        sObj2.Name = &defaultName
    }
    if sObj2.Age == nil {
        sObj2.Age = &defaultAge
    }
    if sObj2.IsBoy == nil {
        sObj2.IsBoy = &defaultBoy
    }
    // TODO 因為是指針,所以用 * 去取value
    fmt.Println("sRet2再次初始化: ", *sObj2.Name, *sObj2.Age, *sObj2.IsBoy) // sRet2再次初始化:  whw 22 true

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

序列化結果不想帶一些屬性的零值—>加omitempty標簽

寫一個方法去返回 *bool 解析后的值並根據業務需求設置默認值

 

~~~~~~~~~~~~~~~~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM