为了账号安全,请及时绑定邮箱和手机立即绑定

Golang json 编组和编码给出奇怪的输出

Golang json 编组和编码给出奇怪的输出

Go
四季花海 2022-11-23 19:54:55
我正在尝试为我的数据库查询自定义错误消息。以下是我首先创建的 struct Erormessage 。接下来,如果 db.query 中有错误,我会执行此封送处理,然后编码并返回。但我最终在我的邮递员测试中得到了这个输出“e30=”。我检查并遵循了几个显示此机制的示例可能有什么问题? error1 := Errormessage{"Error in select"}        error1_enc,errEn := json.Marshal(error1)        if errEn != nil {                          // if error is not nil          // print error          fmt.Println(errEn)      }        json.NewEncoder(w).Encode(error1_enc)            return// declaring a structtype Errormessage struct{          // defining struct variables  errormessage string}func checkExistUser(w http.ResponseWriter, r *http.Request) {   r.ParseForm()  fmt.Println("File Name :", r.FormValue("email"))  result, err := db.Query("SELECT * from userDetailsss")  if err != nil {    //http.Error(w, err, 500)    w.Header().Set("Content-Type", "application/json; charset=utf-8")    w.Header().Set("X-Content-Type-Options", "nosniff")    w.WriteHeader(400)    fmt.Println(err)    error1 := Errormessage{"Error in select"}    error1_enc,errEn := json.Marshal(error1)    if errEn != nil {                  // if error is not nil      // print error      fmt.Println(errEn)  }    json.NewEncoder(w).Encode(error1_enc)        return    //panic(err.Error())  }// 这部分是我的数据库是如何定义和打开的var db *sql.DBvar err errorfunc main() {  db, err = sql.Open("mysql", "******#@tcp(127.0.0.1:3306)/****")  if err != nil {    panic(err.Error())  }  defer db.Close()  router := mux.NewRouter()  router.HandleFunc("/", DoHealthCheck).Methods("POST")  router.HandleFunc("/checkExistUser", checkExistUser).Methods("POST")  log.Fatal(http.ListenAndServe(":8080", router))  }
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

您的代码有两个问题:

  1. 您正在对已经 json 编码的错误进行 json 编码。这意味着您正在对原始 json 字节进行 json 编码,这就是奇怪输出的原因。

  2. Errormessage的结构字段未导出。未导出的字段不会被 encoding/json 包编码。

要修复#1,你可以这样做:

func checkExistUser(w http.ResponseWriter, r *http.Request) {

    r.ParseForm()

    fmt.Println("File Name :", r.FormValue("email"))


    result, err := db.Query("SELECT * from userDetailsss")

    if err != nil {

        w.Header().Set("Content-Type", "application/json; charset=utf-8")

        w.Header().Set("X-Content-Type-Options", "nosniff")

        w.WriteHeader(400)

        

        // use only Encode, no need to call json.Marshal

        if err := json.NewEncoder(w).Encode(Errormessage{"Error in select"}); err != nil {

            log.Println("failed to send reposnse:", err)

        }

        return

    }

    

    // ...

}

要修复 #2,您可以执行以下操作:


type Errormessage struct {

    // export the field, i.e. change it to start with an upper case letter

    Errormessage string `json:"errormessage"`

}


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信