fix: jsonschema integer validation (#852)

This commit is contained in:
Wei-An Yen
2024-09-21 02:22:01 +08:00
committed by GitHub
parent a5fb55321b
commit 1ec8c24ea7
2 changed files with 42 additions and 10 deletions

View File

@@ -36,6 +36,10 @@ func Validate(schema Definition, data any) bool {
_, ok := data.(bool) _, ok := data.(bool)
return ok return ok
case Integer: case Integer:
// Golang unmarshals all numbers as float64, so we need to check if the float64 is an integer
if num, ok := data.(float64); ok {
return num == float64(int64(num))
}
_, ok := data.(int) _, ok := data.(int)
return ok return ok
case Null: case Null:

View File

@@ -86,14 +86,6 @@ func TestUnmarshal(t *testing.T) {
content []byte content []byte
v any v any
} }
var result1 struct {
String string `json:"string"`
Number float64 `json:"number"`
}
var result2 struct {
String string `json:"string"`
Number float64 `json:"number"`
}
tests := []struct { tests := []struct {
name string name string
args args args args
@@ -108,7 +100,10 @@ func TestUnmarshal(t *testing.T) {
}, },
}, },
content: []byte(`{"string":"abc","number":123.4}`), content: []byte(`{"string":"abc","number":123.4}`),
v: &result1, v: &struct {
String string `json:"string"`
Number float64 `json:"number"`
}{},
}, false}, }, false},
{"", args{ {"", args{
schema: jsonschema.Definition{ schema: jsonschema.Definition{
@@ -120,7 +115,40 @@ func TestUnmarshal(t *testing.T) {
Required: []string{"string", "number"}, Required: []string{"string", "number"},
}, },
content: []byte(`{"string":"abc"}`), content: []byte(`{"string":"abc"}`),
v: result2, v: struct {
String string `json:"string"`
Number float64 `json:"number"`
}{},
}, true},
{"validate integer", args{
schema: jsonschema.Definition{
Type: jsonschema.Object,
Properties: map[string]jsonschema.Definition{
"string": {Type: jsonschema.String},
"integer": {Type: jsonschema.Integer},
},
Required: []string{"string", "integer"},
},
content: []byte(`{"string":"abc","integer":123}`),
v: &struct {
String string `json:"string"`
Integer int `json:"integer"`
}{},
}, false},
{"validate integer failed", args{
schema: jsonschema.Definition{
Type: jsonschema.Object,
Properties: map[string]jsonschema.Definition{
"string": {Type: jsonschema.String},
"integer": {Type: jsonschema.Integer},
},
Required: []string{"string", "integer"},
},
content: []byte(`{"string":"abc","integer":123.4}`),
v: &struct {
String string `json:"string"`
Integer int `json:"integer"`
}{},
}, true}, }, true},
} }
for _, tt := range tests { for _, tt := range tests {