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

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

  

}


查看完整描述

1 回答

?
温温酱

TA贡献1478条经验 获得超2个赞

您的代码有两个问题:

  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

添加回答

举报

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