在POST中解码来自POST请求的JSON失败

时间:2016-03-13 11:48:25

标签: json go

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

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

有什么问题?

1 个答案:

答案 0 :(得分:3)

来自Unmarshal documentation(强调是我的):

  

要将JSON解组为结构,Unmarshal将传入的对象键与Marshal使用的键(结构字段名称或其标记)匹配,更喜欢精确匹配,但也接受不区分大小写的匹配。 Unmarshal只会设置结构的导出字段

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

type Test struct {
  ID   int
  Text string
}

注意我每Golang naming conventions使用ID而不是Id