たとえば、次の
struct
があります
type Address struct {
City string `json:"city" binding:"required"`
AddressLine string `json:"address_line" binding:"required"`
}
そして、私はユーザーからのリクエストを処理するために次の機能を持っています
func AddressCreate(c *gin.Context) {
var address Address
if err := c.BindJSON(&address); err == nil {
// if everything is good save to database
// and return success message
db.Create(&address)
c.JSON(http.StatusOK, gin.H {"status":"success"})
} else {
c.JSON(http.StatusBadRequest, err)
}
}
期待される動作は、この方法でフォーマットされたJSONを返すことです
[
{
"city":"required"
}
{
"address_line":"required"
}
]
しかし、私はこのような形式のエラーが発生しています
"Address.City": {
"FieldNamespace": "Address.City",
"NameNamespace": "City",
"Field": "City",
"Name": "City",
"Tag": "required",
"ActualTag": "required",
"Kind": 24,
"Type": {},
"Param": "",
"Value": ""
},
"Address.AddressLine": {
"FieldNamespace": "AddressLine",
"NameNamespace": "AddressLine",
"Field": "AddressLine",
"Name": "AddressLine",
"Tag": "required",
"ActualTag": "required",
"Kind": 24,
"Type": {},
"Param": "",
"Value": ""
}
私は何を試しましたか:
error
をキャストする関数を作成しました
ValidationErrors
へすべての
FieldError
を反復処理します
その中にある
func ListOfErrors(e error) []map[string]string {
ve := e.(validator.ValidationErrors)
InvalidFields := make([]map[string]string, 0)
for _, e := range ve {
errors := map[string]string{}
// field := reflect.TypeOf(e.NameNamespace)
errors[e.Name] = e.Tag
InvalidFields = append(InvalidFields, errors)
}
return InvalidFields
}
出力の見た目はずっと良い
[
{
"City":"required"
},
{
"AddressLine":"required"
}
]
しかし、フィールドの名前に関する問題を解決することはできません。
Name
を交換できません
name
へstructsタグ
json:"city"
で書きました
。私の質問は、答えがはいの場合、問題を解決する正しい方法を選択したのですか?フィールドのjsonタグを取得する方法ですか?
回答 2 件
jsonタグで定義されているものと同じにする場合は、リフレクションを使用して、データ型からそのタグをプルする必要があります。
私はあなたのライブラリを持っていないので、コンパイルもチェックもできません。しかし、私はあなたが何を求めているかはこれらの線に沿って進むべきだと信じています:
func ListOfErrors(address *Address, e error) []map[string]string { ve := e.(validator.ValidationErrors) InvalidFields := make([]map[string]string, 0) for _, e := range ve { errors := map[string]string{} // field := reflect.TypeOf(e.NameNamespace) field, _ := reflect.TypeOf(address).Elem().FieldByName(e.Name) jsonTag := string(field.Tag.Get("json")) errors[jsonTag] = e.Tag InvalidFields = append(InvalidFields, errors) } return InvalidFields }
address
のタイプとして少し工夫されていることに注意してください パラメータは本質的に既知です。したがって、関数パラメーターとして厳密には必要ありません。ただし、address *Address
は変更できますaddress interface{}
へ 他のタイプにも使用します。免責事項:簡潔にするためにエラーチェックをスキップしましたが、コード内のエラー(たとえば、そのようなフィールドエラーがないか、そのフィールドにjsonタグがないか)を確認する必要があります。
関連記事
- ubuntu 2004でセキュリティを損なうエラー[IP:91189913880]をフェッチできませんでした
- 増分バックアップ中にbtrfsエラーがエクステントのクローンを作成できませんでした
- エラー:Windowsサービスの開始中に「[SC] StartServiceFAILED1053」
- Uncaught(in promise)エラー:リクエストはステータスコード400で失敗しました
- ユーザー検証に失敗しました:email:パス `email`が必要です
- 検証ルールのデフォルトのツールチップのカスタムテンプレートを作成するにはどうすればよいですか?
- laravel 8フォーム検証が機能を停止し、エラーをスローします
- Node jsで「_message: 'itemvalidationfailed'」を解決するにはどうすればよいですか?
- AzurePowerShellでカスタムエラーメッセージを表示して終了します
- カスタム損失関数を使用する場合のmodelfit()のエラー
ToSnake
を使用できます スネークケースの名前: