この記事では、golang に関する知識を紹介し、主に golang の json 操作について紹介します。興味のある友達は一緒に見てください。皆様のお役に立てれば幸いです。
です。読み書きが簡単です。 golang は、JSON データを操作するための encoding/json パッケージを提供します。
import (
"encoding/json"
"fmt")type Student struct {
Name string
Age int
Skill string}func main() {
stu := Student{"tom", 12, "football"}
data, err := json.Marshal(&stu)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
return
}
fmt.Println("序列化后: ", string(data))}
func main() {
str := `{"Name":"tom","Age":12,"Skill":"football"}`
var stu2 Student
err := json.Unmarshal([]byte(str), &stu2)
if err != nil {
fmt.Printf("反序列化错误 err=%v\n", err)
return
}
fmt.Printf("反序列化后: Student=%v, Name=%v\n", stu2, stu2.Name)}
を使用して次のように出力できます: 逆シリアル化後: Student={tom 12 Football} , Name=tom
(3) 構造体をシリアル化した後にキーの名前をカスタマイズできることを実現する方法カスタマイズされたキーの名前については、構造体変数で指定できます。
tag label<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">type Student struct {
Name string `json:"stu_name"`
Age int `json:"stu_age"`
Skill string // 也可以不指定 tag标签,默认就是 变量名称}func main() {
stu := Student{"tom", 12, "football"}
data, err := json.Marshal(&stu)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
return
}
fmt.Println("序列化后: ", string(data))}</pre><div class="contentsignin">ログイン後にコピー</div></div>
を出力すると、キーの名前が指定したタグ ラベルの名前に変更されたことがわかります
func main() { // map 转 Json字符串 m := make(map[string]interface{}) m["name"] = "jetty" m["age"] = 16 data, err := json.Marshal(&m) if err != nil { fmt.Printf("序列化错误 err=%v\n", err) return } fmt.Println("序列化后: ", string(data)) // 打印: 序列化后: {"age":16,"name":"jetty"} // Json字符串 转 map str := `{"age":25,"name":"car"}` err = json.Unmarshal([]byte(str), &m) if err != nil { fmt.Printf("反序列化错误 err=%v\n", err) return } fmt.Printf("反序列化后: map=%v, name=%v\n", m, m["name"]) // 打印: 反序列化后: map=map[age:25 name:car], name=car}
type User struct { Name string `json:"u_name"` age int `json:"u_age"` Skill string // 也可以不指定 tag标签,默认就是 变量名称 addr string}func main() { user := User{"admin", 23, "football", "上海"} data, err := json.Marshal(&user) if err != nil { fmt.Printf("序列化错误 err=%v\n", err) return } fmt.Println("序列化后: ", string(data)) // 打印: 序列化后: {"u_name":"admin","Skill":"football"}}
先頭文字が小文字の場合はタグを付けても付けなくてもjsonデータに変換できませんが、大文字の場合はjsonデータに変換できます。タグでエイリアス化されており、タグが追加されていない場合は json データに変換されます。フィールドは構造体変数の元の名前と一致します
4. JSON 操作に関するいくつかのヒント
type User struct { Name string `json:"u_name"` Password string `json:"password"` Email string `json:"email"`}func main() { user := User{"admin", "pwd", "user@163.com"} person := Person{23, "上海"} // 忽略掉 Password 字段 data, _ := json.Marshal(struct { *User Password string `json:"password,omitempty"` }{User: &user}) fmt.Println("忽略字段: ", string(data)) // 打印: 忽略字段: {"u_name":"admin","email":"user@163.com"}}
data, _ = json.Marshal(struct { *User Skill string `json:"skill"` // 临时添加额外的 Skill字段}{ User: &user, Skill: "football",})fmt.Println("添加额外字段: ", string(data))
#(3) 2 つの構造体をマージします
#type User struct { Name string `json:"u_name"` Password string `json:"password"` Email string `json:"email"`}type Person struct { Age int Addr string `json:"addr"`}func main() { // 初始化两个 struct user := User{"admin", "pwd", "user@163.com"} person := Person{23, "上海"} data, _ := json.Marshal(struct { *User *Person }{ User: &user, Person: &person, }) fmt.Println("合并两个struct: ", string(data))}
(4) 文字列は int 型に渡されます
emp := struct { // 创建匿名 struct Num int `json:"num,string"`}{15,}data, _ := json.Marshal(&emp)fmt.Println("数字转成字符串: ", string(data)) // 数字转成字符串: {"num":"15"}str := `{"Num":"25"}`_ = json.Unmarshal([]byte(str), &emp)fmt.Printf("字符串转成数字: Emp.Num=%v\n", emp.Num) // 字符串转成数字: Emp.Num=25
str = ` {"u_name":"system","password":"abc","email":"user2@163.com","Age":23,"addr":"杭州"}`var user2 Uservar person2 Person_ := json.Unmarshal([]byte(str), &struct { *User *Person}{ User: &user2, Person: &person2,})fmt.Printf("分成两个struct: User=%v, Person=%v\n", user2, person2)
以上がgolangのjson操作を詳しく解説した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。