我正在 Go 中設計一些 REST API 端點。我使用結構來定義在我的 API 方法中處理的物件。這些物件作為 json 發送并存盤在 Firebase 中。假設我有以下簡單的結構:
type Person struct {
Name string `json:"name" firestore:"name"`
Gender string `json:"gender,omitempty" firestore:"gender"`
Nationality string `json:"nationality,omitempty" firestore:"nationality"`
}
我有以下要求:
- 執行
GET請求和從 firebase 讀取時,所有欄位都是必需的。 - 執行
POST請求并將 json 正文序列化為 struct時,所有欄位都是必需的。 Name執行PATCH請求并將 json 正文序列化為 struct時,僅需要該欄位。
基于所有方法的相同結構進行序列化的最簡潔方法是什么?執行GET請求時沒有問題,因為所有欄位都并且需要出現在 Firebase 中。但是,當我打算使用omitempty標簽進行 json 序列化時,我不能強制POST請求包含所有欄位,而PATCH請求只包含欄位的子集。
uj5u.com熱心網友回復:
您可以實作自定義 marshal介面或使用https://github.com/json-iterator/go支持自定義 json 標簽的 3rd 方庫
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
type Person struct {
Name string `json1:"name" json2:"name"`
Gender string `json1:"gender,omitempty" json2:"gender"`
Nationality string `json1:"nationality,omitempty" json2:"nationality"`
}
func main() {
p := Person{Name: "bob"}
json1 := jsoniter.Config{TagKey: "json1"}.Froze()
json2 := jsoniter.Config{TagKey: "json2"}.Froze()
b1, _ := json1.Marshal(&p)
b2, _ := json2.Marshal(&p)
fmt.Println(string(b1))
fmt.Println(string(b2))
}
輸出:
{"name":"bob"}
{"name":"bob","gender":"","nationality":""}
uj5u.com熱心網友回復:
我可能會寫一個驗證函式。
type Person struct {
Name string `json:"name" firestore:"name"`
Gender string `json:"gender,omitempty" firestore:"gender"`
Nationality string `json:"nationality,omitempty" firestore:"nationality"`
}
// ValidatePost validates the struct contains values for all mandatory fields for POST operations
func (p Person) ValidatePost()bool {
if p.Name =="" || p.Gender == "" || p.Nationality == ""{
return false
}
return true
}
// ValidatePatch validates the struct contains values for all mandatory fields for PATCH operations
func (p Person) ValidatePatch()bool {
if p.Name =="" {
return false
}
return true
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/332829.html
下一篇:覆寫發布請求
