Golang Json 编解码

编码

Go 复制代码
json.NewEncoder(<Writer>).encode(v)
json.Marshal(&v)

解码

Go 复制代码
json.NewDecoder(<Reader>).decode(&v)
json.Unmarshal([]byte, &v)

使用示例

Go 复制代码
type Person struct {
    Name string `json:"name"`
    Age int `json:"age"`
}
Go 复制代码
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)
    }

未知类型处理

使用 interface 接收 json.Unmarshal 的结果,然后利用 type assertion 特性 (把解码结果转换为 map[string]interface{} 类型) 来进行后续操作。

Go 复制代码
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的输入

Go 复制代码
func HandleUse(w http.ResponseWriter, r *http.Request) {
    var u Use
    if 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切片

Go 复制代码
//将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)
}
相关推荐
Stark-C3 小时前
万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统
macos·docker·策略模式
Roc.Chang3 小时前
macos 使用 nvm 管理 node 并自定义安装目录
macos·node.js·nvm
小林想被监督学习4 小时前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose4 小时前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
PigeonGuan7 小时前
【jupyter】linux服务器怎么使用jupyter
linux·ide·jupyter
三劫散仙7 小时前
Mac vscode 激活列编辑模式
macos
小狮子安度因8 小时前
PyQt的安装和再PyCharm中的配置
ide·pycharm·pyqt
VernonJsn10 小时前
visual studio 2005的MFC各种线程函数之间的调用关系
ide·mfc·visual studio
戎梓漩10 小时前
windows下安装curl,并集成到visual studio
ide·windows·visual studio
endingCode11 小时前
45.坑王驾到第九期:Mac安装typescript后tsc命令无效的问题
javascript·macos·typescript