我使用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)
}
有什么问题?
答案 0 :(得分:3)
来自Unmarshal
documentation(强调是我的):
要将JSON解组为结构,Unmarshal将传入的对象键与Marshal使用的键(结构字段名称或其标记)匹配,更喜欢精确匹配,但也接受不区分大小写的匹配。 Unmarshal只会设置结构的导出字段。
您需要更改结构中的字段定义:
type Test struct {
ID int
Text string
}
注意我每Golang naming conventions使用ID
而不是Id
。