Golang的标准库中"encoding/json"包含了对json的处理,Golang的数据类型与json的类型的转化规则为:
Golang 数据类型 | JSON 数据类型 |
bool | Boolean |
int、float | Number |
string | String |
struct | Object |
array、slice | Array |
[]byte | base64编码后的JSON String |
map | JSON Object, key必须是string |
interface{} | 按照内部实际进行转换 |
nil | null |
channel, func | UnsupportedTypeError |
我们来看代码:
package main
import (
"encoding/json"
"fmt"
"reflect"
)
// Person 人的基本属性
type Person struct {
Name string `json:"name"` //Name与name不一定需要一样
Age int `json:"age"`
Sex string `json:"sex"`
Weight float32 `json:"weight"`
}
func main() {
//初始化一个person
mrtwenty := Person{"mrtwenty", 12, "男", 17.1}
str, err := json.Marshal(mrtwenty) //json序列化
if err != nil {
panic(err)
}
fmt.Println("序列化后的字符串:", string(str)) //返回的json key 按照结构体定义的方式呈现 ,Name变成了name
//反序列化
var person Person //先定义一个变量
err = json.Unmarshal(str, &person) //json反序列化
if err != nil {
panic(err)
}
fmt.Println("反序列化回来:", person, reflect.TypeOf(person))
fmt.Println("输出其中的值:", person.Name) //记得这里会变成大写
personList := [2]Person{}
personList[0] = Person{"mrtwenty", 12, "男", 17.1}
personList[1] = Person{"zhao", 12, "男", 17.1}
str, err = json.Marshal(personList) //json序列化
if err != nil {
panic(err)
}
fmt.Println("序列化后的字符串:", string(str))
var personList2 []Person
err = json.Unmarshal(str, &personList2) //json反序列化
if err != nil {
panic(err)
}
fmt.Println("反序列化回来:", personList2, reflect.TypeOf(personList2))
fmt.Println("输出其中的值:", personList2[1].Name)
fmt.Println("循环输出:")
for _, p := range personList2 {
fmt.Println(p.Name, p.Age)
}
}
先定义一个结构体,初始化后,进行序列化与反序列化处理,上面的例子应该是golang最常见的用法了。