💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
### 概述 在go中,结构体想转成json,变量名首字母必须是大写 . #### 通过结构体生成json ~~~ type Person struct { Company string //首字母要大写 Subjects []string IsOk bool Price float64 } func main() { s := Person{"ali", []string{"PHP", "JAVA", "GO"}, true, 1000} buf, err := json.Marshal(s) //json.MarshalIndent(s,""," ")可以格式化打印 if err != nil { fmt.Println(err) return } fmt.Println(string(buf)) } ~~~ ~~~ {"Company":"ali","Subjects":["PHP","JAVA","GO"],"IsOk":true,"Price":1000} ~~~ ### struct_tag使用 ~~~ type Person struct { Company string `json:"company"` //二次编码 Subjects []string `json:"-"` //-代表此字段不会输出到屏幕 IsOk bool `json:",string"` //把bool转换成字符串 Price float64 } func main() { s := Person{"ali", []string{"PHP", "JAVA", "GO"}, true, 1000} buf, err := json.Marshal(s) if err != nil { fmt.Println(err) return } fmt.Println(string(buf)) } ~~~ ~~~ {"company":"ali","IsOk":"true","Price":1000} ~~~ ### 通过map生成json ~~~ m := make(map[string]interface{}, 4) m["company"] = "facebook" m["subjects"] = []string{"PHP", "JAVA", "GO"} m["isok"] = true m["price"] = 100 res, err := json.MarshalIndent(m, "", " ") //第三个参数是tab if err != nil { fmt.Println(err) return } fmt.Println(string(res)) ~~~ ~~~ { "company": "facebook", "isok": true, "price": 100, "subjects": [ "PHP", "JAVA", "GO" ] } ~~~ ### json解析到结构体 ~~~ type Person struct { Company string Subjects []string IsOk bool Price float64 } type Person1 struct { Company string Subjects []string } func main() { jsonBuf := `{ "company": "facebook", "isok": true, "price": 100, "subjects": [ "PHP", "JAVA", "GO" ] }` var p Person err := json.Unmarshal([]byte(jsonBuf), &p) //这里必须是取地址 if err != nil { fmt.Println(err) return } fmt.Println(p) fmt.Printf("%+v\n", p) var p1 Person1 err = json.Unmarshal([]byte(jsonBuf), &p1) //这里必须是取地址 if err != nil { fmt.Println(err) return } fmt.Println(p1) fmt.Printf("%+v\n", p1) } ~~~ ~~~ {facebook [PHP JAVA GO] true 100} {Company:facebook Subjects:[PHP JAVA GO] IsOk:true Price:100} {facebook [PHP JAVA GO]} {Company:facebook Subjects:[PHP JAVA GO]} ~~~ ### json解析到map 相比于结构体,map要复杂一点,因为要通过类型断言来反推类型. ~~~ func main() { jsonBuf := `{ "company": "facebook", "isok": true, "price": 100, "subjects": [ "PHP", "JAVA", "GO" ] }` m := make(map[string]interface{}, 4) err := json.Unmarshal([]byte(jsonBuf), &m) if err != nil { fmt.Println(err) return } //fmt.Printf("%+v", m) var str string //str = m["company"] //无法直接赋值,哪怕用string()也不行 //fmt.Println(str) for key, value := range m { switch data := value.(type) { case string: str = data fmt.Printf("字符串类型,key = %s,value = %s\n", key, str) case bool: fmt.Printf("布尔类型,key = %s,value = %v\n", key, data) case float64: fmt.Printf("布尔类型,key = %s,value = %v\n", key, data) case []interface{}: //这个要注意 fmt.Printf("切片类型,key = %s,value = %v\n", key, data) } } } ~~~ ~~~ 布尔类型,key = isok,value = true 布尔类型,key = price,value = 100 切片类型,key = subjects,value = [PHP JAVA GO] 字符串类型,key = company,value = facebook ~~~ ### 自定义struct转json 实现以下两个接口即可 ~~~ type Marshaler interface { MarshalJSON() ([]byte, error) } type Unmarshaler interface { UnmarshalJSON([]byte) error } ~~~