>  기사  >  백엔드 개발  >  golang의 json 작업을 자세히 설명하는 기사

golang의 json 작업을 자세히 설명하는 기사

PHPz
PHPz앞으로
2023-03-29 14:24:27940검색

이 글은 golang에 대한 관련 지식을 제공합니다. 주로 golang의 json 작업을 소개합니다. 관심 있는 친구들은 아래를 살펴보세요.

golang의 json 작업을 자세히 설명하는 기사

golang의 json 작업

JSON은 경량 데이터 교환 형식입니다. 읽고 쓰기가 쉽습니다. golang은 JSON 데이터를 조작하기 위한 encoding/json 패키지를 제공합니다. encoding/json 包来操作JSON数据。

1. 结构体与JSON互转

(1)使用 json.Marshal() 方法,把结构体转成 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))}

打印: 序列化后: {“Name”:“tom”,“Age”:12,“Skill”:“football”}

(2)JSON字符串 转 结构体,可以使用 json.Unmarshal()方法

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)如何实现结构体序列化后key的名称能自定义

对于自定义key的名称,可以给 struct变量指定一个tag标签

1. 구조를 JSON으로 변환

(1) json.Marshal() 메서드를 사용하여 구조를 JSON 문자열로 변환
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))}

인쇄: 직렬화 후: {" Name": "tom", "Age": 12, "Skill": "football"}

(2) JSON 문자열을 구조로 변환하려면 json.Unmarshal() 메서드를 사용할 수 있습니다

    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}
  • Print:
  • 역직렬화 후: Student={tom 12 football}, Name=tom
  • (3) 구조 직렬화 후 키 이름을 사용자 정의할 수 있다는 것을 인식하는 방법

    커스텀의 경우 키 이름을 정의하려면 구조체 변수에 태그 라벨을 지정하면 됩니다.

    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"}}
    인쇄 후 키 이름이 키 이름으로 변경된 것을 확인할 수 있습니다. 태그 라벨을 지정했습니다
    직렬화 후: {" stu_name":"tom","stu_age":12,"Skill":"football"}

    2. 맵과 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"}}

    3. 태그 태그를 추가하지 않고도 구조의 변수가 정상적으로 작동합니까? json 데이터로 변환

    변수의 첫 글자가 소문자이면 비공개입니다. 반영 정보를 얻을 수 없기 때문에 전송할 수 없습니다.

    변수의 첫 글자가 대문자이면 공개입니다. 태그 추가 여부에 관계없이 정상적으로 변환이 가능하며, 태그가 붙은 변수는 태그 이름에 따라 표시됩니다.

    예:

    data, _ = json.Marshal(struct {
    	*User
    	Skill string `json:"skill"`  // 临时添加额外的 Skill字段}{
    	User: &user,
    	Skill: "football",})fmt.Println("添加额外字段: ", string(data))

    인쇄를 통해 age, addr 등 소문자 변수가 json 데이터로 변환되지 않는 것을 발견했습니다.

    요약:

    첫 글자가 소문자이면 태그 여부에 관계없이 json 데이터로 변환할 수 없고, 대문자이고 태그가 있으면 json의 필드에 별칭을 지정할 수 있습니다. 구조 변수의 원래 이름과 동일합니다

    4. JSON 작업에 대한 몇 가지 팁

    (1) 구조체에 지정된 필드를 무시합니다.

    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))}

    필드 무시: {"u_name":"admin" ,"email":"user@163.com"}}

    (2) 추가 필드 추가
    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
    추가 필드 추가: {"u_name":"admin","password":"pwd","email ":"user@163.com","skill" :"football"}

    (3) 두 구조체 병합

    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)

    두 구조체 병합: {"u_name":"admin","password":"pwd ","email":"user@163.com", "Age": 23, "addr": "Shanghai"}🎜🎜🎜 (4) 문자열은 int 유형🎜rrreee🎜🎜🎜에 전달됩니다. ) json은 두 개의 struct🎜rrreee🎜 struct로 나뉩니다: User={system abc user2@163.com}, Person={23 Hangzhou}🎜🎜🎜🎜🎜🎜🎜🎜🎜추천 학습: "🎜go 비디오 튜토리얼🎜" 🎜🎜

    위 내용은 golang의 json 작업을 자세히 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제