go 语言结构体与 json 数据转换

JSON 概述

JSON ( JavaScript Object Notation, JS 对象简谱 ) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

将结构体转换为 JSON 字符串

可以使用 encodig/json 工具包来实现结构体和json数据的转换 :

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	var p1 = Person{
		"John",
		30,
	}
	// 使用 json.Marshal 函数将结构体转换为 byte 类型的字符数据
	jsonByte, _ := json.Marshal(p1)
	// 使用  string 将字符转换为字符串
	fmt.Println(string(jsonByte))
}

将字符串转换为结构体

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	// 定义字符串
	var personJson = `{"ame":"John","Age":30}`
	// 初始化空结构体
	var person Person
	// 将字符串转换为结构体 注意利用地址方式赋值给结构体
	err := json.Unmarshal([]byte(personJson), &person)
	if err != nil {
		fmt.Printf("error: %v", err)
	} else {
		fmt.Printf("%#v", person)
	}

}

结构体标签

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string "json:\"name\""
	Age  int    "json:\"age\""
}

func main() {
	// 定义字符串
	var personJson = `{"name":"John","age":30}`
	// 初始化空结构体
	var person Person
	// 将字符串转换为结构体 注意利用地址方式赋值给结构体
	err := json.Unmarshal([]byte(personJson), &person)
	if err != nil {
		fmt.Printf("error: %v", err)
	} else {
		fmt.Printf("%#v", person)
	}

}

复杂结构体转换

package main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Name string "json:\"name\""
	Age  int    "json:\"age\""
}

type Class struct {
	Name     string    "json:\"name\""
	Students []Student "json:\"students\""
}

func main() {
	var classFive Class = Class{}
	classFive.Name = "一年级五班"
	classFive.Students = append(classFive.Students, Student{Name: "张三", Age: 18})
	classFive.Students = append(classFive.Students, Student{Name: "李四", Age: 19})
	classFive.Students = append(classFive.Students, Student{Name: "王五", Age: 20})

	jsonByte, err := json.Marshal(classFive)
	if err != nil {
		println(err)
	} else {
		fmt.Println(string(jsonByte))
	}

	// 将字符串转换为结构体
	var jsonStr string = `{"name":"一年级五班","students":[{"name":"张三","age":18},{"name":"李四","age":19},{"name":"王五","age":20}]}`
	var classSix Class = Class{}
	err2 := json.Unmarshal([]byte(jsonStr), &classSix)
	if err2 != nil {
		println(err2)
	} else {
		fmt.Println(classSix.Name)
		for _, student := range classSix.Students {
			fmt.Println(student.Name, student.Age)
		}
	}
}