google/jsonschema-goを使った構造体のバリデーション
MCP Go SDKで利用されているJSONスキーマライブラリはgithub.com/google/jsonschema-goとして一般に公開されているのでバリデーション用途として使えるのかを試した。2026年2月時点の結論としては、JSONスキーマとして使うにはいいのだが、構造体のバリデーションが行えないので一般的なバリデーションライブラリと比べたら実用的とは言いづらい。
google/jsonschema-go には Schema と、参照を解決した Resolved の2つがある。
- Schema … スキーマそのもの
- Resolved … $ref などの参照が解決済みになったスキーマ
バリデーション用途として使うためには Resolved を使わなければならない。
スキーマはJSONを直接記述してもいいし、簡単なものなら構造体タグからも生成できる。生成のルールはドキュメントにある通り、
- string などの型情報はJSONスキーマでも対応する型として扱う
- json タグの omitempty または omitzero があれは省略可能で、なければ必須となる
- jsonschema: タグでJSONスキーマの description を記述できる
簡単なサンプルコードを書いた。
package main
import ( "fmt" "log"
"github.com/google/jsonschema-go/jsonschema")
type User struct { ID int `json:"id" jsonschema:"user identifier"` Name string `json:"name,omitzero" jsonschema:"user's name"`}
func main() { schema, err := jsonschema.For[User](&jsonschema.ForOptions{}) if err != nil { log.Fatal("could not create a schema:", err) } resolved, err := schema.Resolve(&jsonschema.ResolveOptions{}) if err != nil { log.Fatal("could not resolve:", err) } // 今のところ構造体を直接バリデーションするとエラーになる //resolved.Validate(User{}) fmt.Println(resolved.Validate(map[string]any{"id": 1}))}