繁体   English   中英

Go中从POST请求解码JSON失败

[英]Decoding JSON from POST request fails in Go

我使用JSON数据将POST请求发送到Go应用程序,如下所示:

var test = {text: "Lorem ipsum dolor sit amet"};

$.ajax({
  url: "/api/test/add",
  type: "POST",
  dataType: "json",
  contentType: "application/json; charset=utf-8",
  data: JSON.stringify(test),
  success: function(data) {
    // ...
  },
  error: function(xhr, status, err) {
    // ...
  }
});

在我的Go应用程序中,我有以下代码(使用vestigo ):

type Test struct {
  id   int
  text string
}

func apiAddTestHandler(w http.ResponseWriter, r *http.Request) {
  r_body, err := ioutil.ReadAll(r.Body)
  if err != nil {
    panic(err)
  }

  // Here looks like everything is ok because I get
  // {"text": "Lorem ipsum dolor sit amet"} if I try
  // to convert r_body to string (string(r_body)).

  var test Test
  err = json.Unmarshal(r_body, &test)
  if err != nil {
    panic(err)
  }

  // Process test struct below, but here I get
  // {id:0 text:} if I try to use or print the value
  // of test (fmt.Printf("%+v\n", test)).
}

func main() {
  router := vestigo.NewRouter()
  router.Post("/api/test/add", apiAddTestHandler)

  err := http.ListenAndServe(":3000", router)
  if err != nil {
    log.Fatal("ListenAndServe: ", err)
  }
}

问题是,在apiAddTestHandler()中,我无法用解码的JSON数据“填充”测试结构。 评论中有更多信息。 我也尝试了以下运气不好的代码段:

decoder := json.NewDecoder(r.Body)
var test Test
err := decoder.Decode(&test)
if err != nil {
  panic(err)
}

问题是什么?

Unmarshal文档中 (重点是我的):

为了将JSON解组到结构中,Unmarshal将传入的对象键与Marshal使用的键(结构字段名称或其标记)进行匹配,希望使用精确匹配,但还要接受不区分大小写的匹配。 Unmarshal将仅设置struct的导出字段

您需要在结构中更改字段定义:

type Test struct {
  ID   int
  Text string
}

请注意,我按照Golang命名约定使用ID而不是Id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM