2017-10-05 21 views
0

我在看golang驗證器並想知道如何驗證兩個字段在一起?在golang驗證結構中的兩個字段

我正在發送一個json主體來處理請求並將主體解碼到這個結構中。在身體的兩個參數(ID1 & ID2)中,其中一個必須存在。所以,我想驗證兩者都不存在的情況。

type IDs struct { 
    ID1 int64 `json:"id_one"` 
    ID2 int64 `json:"id_two"` 
} 

我該如何使用這個軟件包來驗證它? https://godoc.org/gopkg.in/validator.v2

我經歷了文檔,找不到辦法做到這一點。

我可以做

type IDs struct { 
    ID1 int64 `json:"id_one" validate:"min=0"` 
    ID2 int64 `json:"id_two" validate:"min=0"` 
} 

但這還是讓人既要缺席,而不是他們中的一個應該存在。

如果不能使用這個軟件包,還有其他方法可以做到這一點嗎?

+1

我會安排時間,這樣我可以,如果它被設置或不告知將使它成爲一個指針的方式。如果值存在,JSON解組器會將其設置爲指向該值,如果沒有值,則爲零。看起來您可以設置一個自定義驗證函數來處理該函數,但是這樣做一次只能驗證一個字段。 –

+2

我認爲手動檢查會更容易:'if ID1 == nil && ID2 == nil {return err}' –

回答

3

您可以使用自定義驗證功能。

遊樂場 - https://play.golang.org/p/vYtp5xKakJ

package main 

import (
    "errors" 
    "fmt" 

    validator "gopkg.in/validator.v2" 
) 

var atLeastOneIntValues []interface{} 

func atLeastOneInt(v interface{}, param string) error { 
    atLeastOneIntValues = append(atLeastOneIntValues, v) 
    if len(atLeastOneIntValues) == 2 { 
     for _, value := range atLeastOneIntValues { 
      if value.(int64) != 0 { 
       return nil 
      } 
     } 

     return errors.New("At least one non-empty value should be presented") 
    } 

    return nil 
} 

type IDs struct { 
    ID1 int64 `json:"id_one" validate:"atleastoneint"` 
    ID2 int64 `json:"id_two" validate:"atleastoneint"` 
} 

func main() { 
    validator.SetValidationFunc("atleastoneint", atLeastOneInt) 
    fmt.Printf("%v", validator.Validate(IDs{})) 
} 
+0

正是我在找的東西! – Ram

-1

對於沒有直接的&方便的情況,最好是編寫自己的驗證函數,並用它來完成。在處理方面 - 使用這個包不會讓事情變得更有效率,因爲某些代碼在某處最終需要進行相同的檢查!