Skip to content

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}))
}