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)
}
相关推荐
666HZ6664 小时前
关于IDEA的循环依赖问题
java·ide·intellij-idea
程序员Bears6 小时前
IntelliJ IDEA 2025系列通用软件安装教程(Windows版)
ide·windows·pycharm·webstorm
凭君语未可6 小时前
介绍 IntelliJ IDEA 快捷键操作
java·ide·intellij-idea
薛瑄7 小时前
FFmpeg之三 录制音频并保存, API编解码从理论到实战
ffmpeg·音视频·xcode
苏克贝塔9 小时前
2025 VSCode中如何进行dotnet开发环境配置完整教程
ide·vscode·编辑器
只会写bug的靓仔9 小时前
mac 设置飞书默认浏览器(解决系统设置默认浏览器无效)
macos·飞书
尽兴-1 天前
Mac「brew」快速安装Redis
数据库·redis·macos·brew
尽兴-1 天前
Mac 「brew」快速安装MySQL
mysql·macos·adb·brew
聂 可 以1 天前
IntelliJ IDEA修改实体类成员变量的名称(引入了该实体类的全部文件也会自动更新变量的名称)
java·ide·intellij-idea
MoonBit月兔1 天前
双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!
ide·算法·哈希算法