编码
json.NewEncoder(<Writer>).encode(v)
json.Marshal(&v)
解码
json.NewDecoder(<Reader>).decode(&v)
json.Unmarshal([]byte, &v)
使用示例
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 {// 返回的是字节数组 []bytefmt.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}// 编码结果暂存到 bufferbytes3 := 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)}
未知类型处理
使用 interface 接收 json.Unmarshal 的结果,然后利用 type assertion 特性 (把解码结果转换为 map[string]interface{} 类型) 来进行后续操作。
func main() {b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`)var f interface{}json.Unmarshal(b, &f)m := f.(map[string]interface{})fmt.Println(m["Parents"]) // 读取 json 内容fmt.Println(m["a"] == nil) // 判断键是否存在
}
marshal和NewDecoder区别
1、json.NewDecoder是从一个流里面直接进行解码,代码精干
2、json.Unmarshal是从已存在与内存中的json进行解码
3、相对于解码,json.NewEncoder进行大JSON的编码比json.marshal性能高,因为内部使用pool
场景应用
1、json.NewDecoder用于http连接与socket连接的读取与写入,或者文件读取
2、json.Unmarshal用于直接是byte的输入
func HandleUse(w http.ResponseWriter, r *http.Request) {var u Useif err := json.NewDecoder(r.Body).Decode(&u); err != nil {w.WriteHeader(http.StatusInternalServerError)return}w.WriteHeader(http.StatusOK)fmt.Fprintf(w, "姓名:%s,年龄:%d", u.Name, u.Age)
}
将Json数据转换为map切片
//将json数据转换为map切片
func maina6(){jsonStr := `[{"age":21,"hobby":["打"],"name":"liyi","sex":true},{"name":"linging"},{"age":18,"hobby":["学习"],"name":"yiyi","sex":true}]`jsonBytes := []byte(jsonStr)dataSlice := make([]map[string]interface{},0)err := json.Unmarshal(jsonBytes,&dataSlice)if err != nil {fmt.Println("反序列化失败,err=",err)}fmt.Println(dataSlice)
}