跳转到主要内容

这些是为客户端和服务器端编码/解码 json 的代码示例。

让我们从服务器端开始。

解码请求


定义请求参数:首先,定义表示请求参数的结构。

type UserRequest struct {
        Name  string `json:"name"`
        Email string `json:"email"`
}


json.Decoder:在请求处理程序中,用请求体创建一个解码器,并用结构体的指针调用解码方法。

func handler(w http.ResponseWriter, r *http.Request) {
        var req UserRequest
        err := json.NewDecoder(r.Body).Decode(&req)
        if err != nil {
                http.Error(w, err.Error(), 400)
                return
        }
        // process with the request parameters
}


编码响应


定义响应结构:同样,您将定义响应结构。

type UserResponse struct {
        ID    int    `json:"id"`
        Name  string `json:"name"`
        Email string `json:"email"`
}


json.Encoder:在请求处理程序中,使用 ResponseWriter 创建编码器,并使用响应实例调用 encode 方法。

func handler(w http.ResponseWriter, r *http.Request) {
        ...
        resp := UserResponse{
                ID:    123,
                Name:  req.Name,
                Email: req.Email,
        }
        err := json.NewEncoder(w).Encode(resp)
        if err != nil {
                http.Error(w, err.Error(), 500)
                return
        }
}


现在我们转到客户端。

编码请求


定义请求结构:同样,我们从定义请求结构开始。

type UserRequest struct {
        Name  string `json:"name"`
        Email string `json:"email"`
}


json.Encoder:使用 bytes.Buffer 作为空间来写出 json 字符串。

func PostUser(url string, user UserRequest) (*UserResponse, error) {
        b := new(bytes.Buffer)
        err := json.NewEncoder(b).Encode(user)
        if err != nil {
                return nil, err
        }
        resp, err := http.Post(url, "application/json", b)
        if err != nil {
                return nil, err
        }
        // decode response
}


解码响应


定义响应结构:与上一个几乎相同:)

type UserResponse struct {
        ID    int    `json:"id"`
        Name  string `json:"name"`
        Email string `json:"email"`
}


json.Decoder:用响应体创建一个解码器,用结构体调用decode返回。

func PostUser(url string, user UserRequest) (*UserResponse, error) {
      ...
      var userResp *UserResponse
      err = json.NewDecoder(resp.Body).Decode(userResp)
      if err != nil {
              return nil, err
      }
      return userResp, nil
}
文章链接