在Go/Chi中解析带数组的JSON请求体并关联结构体
解决Go/Chi中POST请求JSON数组解析为空的问题
你的问题核心在于结构体的JSON标签格式错误,冒号后面多了空格,导致标准库encoding/json无法正确将JSON字段映射到结构体字段,最终Books切片保持默认的空值。
1. 修正结构体JSON标签
把结构体标签里冒号后的空格全部去掉,正确格式是json:"字段名",修正后的结构体如下:
type AuthorRequest struct{ Name string `json:"name"` BornDate string `json:"bornDate"` Books []BookRequest `json:"books"` } type BookRequest struct{ Title string `json:"title"` PublishYear string `json:"publishYear"` }
2. 完善错误处理(推荐)
当前代码的错误处理仅做日志,建议在解析失败时返回明确的HTTP错误响应,方便调试:
func CreateAuthorAndBooks(w http.ResponseWriter, r *http.Request) { var authorPayload api.AuthorRequest decoder := json.NewDecoder(r.Body) err := decoder.Decode(&authorPayload) if err != nil{ w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadRequest) json.NewEncoder(w).Encode(map[string]string{"error": "无效的请求体格式: " + err.Error()}) return } successMessage := fmt.Sprintf("%v 拥有 %v 本书: %v", authorPayload.Name, len(authorPayload.Books), authorPayload.Books) response := map[string]string{"success": successMessage} w.Header().Set("Content-Type", "application/json") err = json.NewEncoder(w).Encode(response) if err != nil{ w.WriteHeader(http.StatusInternalServerError) // 记录内部错误日志 } // 转换为存储用结构体的逻辑示例 var author Author author.Name = authorPayload.Name bornDate, _ := time.Parse("2006-01-02", authorPayload.BornDate) author.BornDate = bornDate for _, bookReq := range authorPayload.Books { publishYear, _ := strconv.ParseInt(bookReq.PublishYear, 10, 32) author.Books = append(author.Books, Book{ Title: bookReq.Title, PublishYear: int32(publishYear), }) } // 后续存储逻辑... }
为什么标签空格会导致问题?
Go的结构体标签是严格的键值对语法:key:"value",如果冒号后加空格,encoding/json会将 "name"(包含前导空格)视为键的一部分,无法匹配JSON中的"name"字段,因此对应的结构体字段会被忽略,使用默认零值(切片默认是空切片)。
内容的提问来源于stack exchange,提问作者Richard Wright
相关产品推荐
相关产品推荐

