翻过高山走不出你
有点老的问题,但是 valix ( https://github.com/marrow16/valix ) 可以使用条件“开箱即用”地做这些事情。例子...package mainimport ( "fmt" "net/http" "strings" "github.com/marrow16/valix")type Medicare struct { IRN uint8 `json:"irn"` FirstName string `json:"firstName"` MiddleInitial string `json:"middleInitial"` LastName string `json:"lastName"` // set order on this property so that it is evaluated before 'CardExpiry' object is checked... // (and set a condition based on its value) CardType string `json:"cardType" v8n:"order:-1,required,&StringValidToken{['RESIDENT','RECIPROCAL','INTERIM']},&SetConditionFrom{Global:true}"` Number string `json:"number"` CardExpiry *CardExpiry `json:"cardExpiry" v8n:"required,notNull"`}type CardExpiry struct { // this property is required when a condition of `RECIPROCAL` has been set (and unwanted when that condition has not been set)... Day string `json:"day" v8n:"required:RECIPROCAL,unwanted:!RECIPROCAL"` Month string `json:"month" v8n:"required"` Year string `json:"year" v8n:"required"`}var medicareValidator = valix.MustCompileValidatorFor(Medicare{}, nil)func main() { jsonData := `{ "irn": 1, "firstName": "Testing", "lastName": "Test", "cardType": "RECIPROCAL", "number": "2248974514", "cardExpiry": { "month": "01", "year": "2025" } }` medicare := &Medicare{} ok, violations, _ := medicareValidator.ValidateStringInto(jsonData, medicare) // should fail with 1 violation... fmt.Printf("First ok?: %v\n", ok) for i, v := range violations { fmt.Printf("Violation[%d]: Message:%s, Property:%s, Path:%s\n", i+1, v.Message, v.Property, v.Path) } jsonData = `{ "irn": 1, "firstName": "Testing", "lastName": "Test", "cardType": "RECIPROCAL", "number": "2248974514", "cardExpiry": { "day": "01", "month": "01", "year": "2025" } }` ok, _, _ = medicareValidator.ValidateStringInto(jsonData, medicare) // should be ok... fmt.Printf("Second ok?: %v\n", ok) jsonData = `{ "irn": 1, "firstName": "Testing", "lastName": "Test", "cardType": "INTERIM", "number": "2248974514", "cardExpiry": { "month": "01", "year": "2025" } }` ok, _, _ = medicareValidator.ValidateStringInto(jsonData, medicare) // should be ok... fmt.Printf("Third ok?: %v\n", ok) jsonData = `{ "irn": 1, "firstName": "Testing", "lastName": "Test", "cardType": "INTERIM", "number": "2248974514", "cardExpiry": { "day": "01", "month": "01", "year": "2025" } }` ok, violations, _ = medicareValidator.ValidateStringInto(jsonData, medicare) fmt.Printf("Fourth ok?: %v\n", ok) for i, v := range violations { fmt.Printf("Violation[%d]: Message:%s, Property:%s, Path:%s\n", i+1, v.Message, v.Property, v.Path) } // or validate directly from a http request... req, _ := http.NewRequest("POST", "", strings.NewReader(jsonData)) ok, violations, _ = medicareValidator.RequestValidateInto(req, medicare) fmt.Printf("Fourth (as http.Request) ok?: %v\n", ok) for i, v := range violations { fmt.Printf("Violation[%d]: Message:%s, Property:%s, Path:%s\n", i+1, v.Message, v.Property, v.Path) }}游乐场_