[英]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.