golang json 编码解码
json 编码
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { person := Person{"ruby", 24} b, err := json.Marshal(&person) if err == nil { fmt.Printf("%s\n", b) } else { // 错误处理 } }
关键方法 json.Marshal:
func Marshal(v interface{}) ([]byte, error)
这个方法返回的结果是一个字节数组,如果需要转字符串,可以 string(xxx),如:
fmt.Println(string(b))
json 解码
package main import ( "encoding/json" "strings" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { // 需要解码的 json 字符串 str := ` {"name":"ruby","age":24} ` // json decoder 对象, 有个 Decode 方法, 接受一个 struct 参数 decoder := json.NewDecoder(strings.NewReader(str)) var person Person err := decoder.Decode(&person) if err == nil { fmt.Println(person.Name) fmt.Println(person.Age) } }
写成一行就是(str 是需要解码的字符串,v 是结构体变量,需要解码成什么 struct 就定义什么 struct 变量):
json.NewDecoder(strings.NewReader(str)).Decode(v)
总结:
json encode:
1、json.NewEncoder(<Writer>).encode(&v)
2、json.Marshal(&v)
json decode:
1、json.NewDecoder(<Reader>).decode(&v)
2、json.Unmarshal(&v)
下面是 all in one,几种方法的使用比较清晰:
package main import ( "encoding/json" "fmt" "bytes" "strings" ) type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { // 1. 使用 json.Marshal 编码 person1 := Person{"张三", 24} bytes1, err := json.Marshal(&person1) if err == nil { // 返回的是字节数组 []byte fmt.Println("json.Marshal 编码结果: ", string(bytes1)) } // 2. 使用 json.Unmarshal 解码 str := `{"name":"李四","age":25}` // json.Unmarshal 需要字节数组参数, 需要把字符串转为 []byte 类型 bytes2 := []byte(str) // 字符串转换为字节数组 var person2 Person // 用来接收解码后的结果 if json.Unmarshal(bytes2, &person2) == nil { fmt.Println("json.Unmarshal 解码结果: ", person2.Name, person2.Age) } // 3. 使用 json.NewEncoder 编码 person3 := Person{"王五", 30} // 编码结果暂存到 buffer bytes3 := new(bytes.Buffer) _ = json.NewEncoder(bytes3).Encode(person3) if err == nil { fmt.Print("json.NewEncoder 编码结果: ", string(bytes3.Bytes())) } // 4. 使用 json.NewDecoder 解码 str4 := `{"name":"赵六","age":28}` var person4 Person // 创建一个 string reader 作为参数 err = json.NewDecoder(strings.NewReader(str4)).Decode(&person4) if err == nil { fmt.Println("json.NewDecoder 解码结果: ", person4.Name, person4.Age) } }
常见问题:
1、为什么我定义了一个 struct,但是使用 json.Marshal 方法编码之后返回的是空的 byte[] ?
可能原因:struct 里面使用了小写的的字段名,如
type Person struct { name string age int }
需要把 字段名转为 驼峰命名,如果需要编码之后的字段名是小写的,可以给 struct 加个 tag,如上面的例子那样 `json:"name"`