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

我正在尝试为我的数据库查询自定义错误消息。以下是我首先创建的 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 struct

type 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.DB

var err error


func 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))

  

}


四季花海
浏览 76回答 1
1回答

温温酱

您的代码有两个问题:您正在对已经 json 编码的错误进行 json 编码。这意味着您正在对原始 json 字节进行 json 编码,这就是奇怪输出的原因。您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"`}
打开App,查看更多内容
随时随地看视频慕课网APP