json.NewEncoder 是 Go 语言标准库中的一个函数,用于创建一个新的 JSON 编码器(Encoder)。JSON 编码器可以将数据编码为 JSON 格式,并输出到一个 io.Writer 接口类型的输出流中。
源码如下:

其中:
- w 参数代表了一个实现了 io.Writer 接口的对象,例如 http.ResponseWriter、文件、内存缓冲区等。
- 返回值是一个指向 json.Encoder 类型的指针,它可以用来对数据进行 JSON 编码并输出到指定的 io.Writer 中。
使用 json.NewEncoder 可以方便地将数据编码为 JSON 格式,并将结果写入到输出流中,例如将 JSON 响应写入 HTTP 响应体或者将 JSON 数据写入文件中。
举例
package main
import (
"encoding/json"
"os"
)
func main() {
data := map[string]string{"name": "Alice", "age": "25"}
// 创建一个新的 JSON 编码器,关联到标准输出流
encoder := json.NewEncoder(os.Stdout)
// 将数据编码为 JSON 并输出到标准输出流
err := encoder.Encode(data)
if err != nil {
panic(err)
}
}json.NewEncoder 创建了一个 JSON 编码器,并将其与标准输出流关联。然后,我们调用 encoder.Encode 方法将 data 编码为 JSON 并输出到标准输出流中。

如果想要输出到文件中
package main
import (
"encoding/json"
"os"
)
func main() {
data := map[string]string{"name": "Alice", "age": "25"}
// 创建一个新的 JSON 编码器,输出到文件
file, _ := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
encoder := json.NewEncoder(file)
// 将数据编码为 JSON 并输出到文件
err := encoder.Encode(data)
if err != nil {
panic(err)
}
}控制台就没有输出了

输出到了文件

我们还可以 编写一个 Web 服务时,可以使用 json.NewEncoder 将 JSON 响应写入 HTTP 响应体。
package main
import (
"encoding/json"
"net/http"
)
type User struct {
Name string `json:"name"`
Email string `json:"email"`
}
func main() {
http.HandleFunc("/user", getUserHandler)
http.ListenAndServe(":8080", nil)
}
func getUserHandler(w http.ResponseWriter, r *http.Request) {
// 创建一个用户对象
user := User{
Name: "Alice",
Email: "3456652279@qq.com",
}
// 设置响应头为 JSON 类型
w.Header().Set("Content-Type", "application/json")
// 创建一个新的 JSON 编码器,关联到 HTTP 响应体
encoder := json.NewEncoder(w)
// 将用户对象编码为 JSON 并写入 HTTP 响应体
err := encoder.Encode(user)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
可以看到如上的三种方式的传入都实现了 io.Writer 接口
既然有响应,那就有请求
NewDecoder是Go语言标准库encoding/json包中的一个函数,用于创建一个新的JSON解码器(Decoder)。
JSON解码器可以读取JSON数据流,并将其解析为Go语言中的数据结构。使用JSON解码器可以方便地将从Web服务器或其他来源接收到的JSON数据转换为Go语言对象
示例代码
package main
import (
"encoding/json"
"fmt"
"strings"
)
type User struct {
Name string
Pwd int
}
func main() {
jsonStr := `{"Name":"Dreams","Pwd":123456}`
reader := strings.NewReader(jsonStr)
decoder := json.NewDecoder(reader)
var user User
if err := decoder.Decode(&user); err != nil {
fmt.Println("Error decoding JSON:", err)
return
}
fmt.Println("Name:", user.Name)
fmt.Println("Pwd:", user.Pwd)
}上述代码使用strings.NewReader函数将该JSON字符串转换为一个io.Reader对象,然后使用json.NewDecoder函数创建一个JSON解码器。最后,我们调用Decode方法将JSON数据解码到一个Person对象中,并打印出结果。

如果在web应用
package main
import (
"encoding/json"
"log"
"net/http"
)
type User struct {
Name string `json:"name"`
Pwd string `json:"pwd"`
}
func main() {
http.HandleFunc("/user", handleUser)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handleUser(w http.ResponseWriter, r *http.Request) {
// 解析请求体中的 JSON 数据
var user User
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// 打印解析得到的用户信息
log.Printf("user: %+v\n", user)
// 响应成功消息
w.WriteHeader(http.StatusOK)
w.Write([]byte("successfully"))
}使用 json.NewDecoder 来创建一个 Decoder 对象,并将请求的 Body 作为输入。然后,我们使用 Decode 方法将 JSON 数据解析到 user 变量中。




