diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index 8a9fbd61..15215693 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -19,9 +19,10 @@ import ( ) const ( - defaultKeyName = "key" - delimiter = '.' - ignoreKey = "-" + defaultKeyName = "key" + delimiter = '.' + ignoreKey = "-" + numberTypeString = "number" ) var ( @@ -634,7 +635,7 @@ func (u *Unmarshaler) processFieldPrimitiveWithJSONNumber(fieldType reflect.Type target.SetFloat(fValue) default: - return newTypeMismatchErrorWithHint(fullName, typeKind.String(), value.Type().String()) + return newTypeMismatchErrorWithHint(fullName, typeKind.String(), numberTypeString) } SetValue(fieldType, value, target) diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index 2ac19aa4..fd02fd6d 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -5490,7 +5490,7 @@ func TestUnmarshalerProcessFieldPrimitiveWithJSONNumber(t *testing.T) { err := m.processFieldPrimitiveWithJSONNumber(fieldType, value.Elem(), v, &fieldOptionsWithContext{}, "field") assert.Error(t, err) - assert.Equal(t, `type mismatch for field "field", expect "string", actual "int"`, err.Error()) + assert.Equal(t, `type mismatch for field "field", expect "string", actual "number"`, err.Error()) }) t.Run("right type", func(t *testing.T) { diff --git a/core/mapping/yamlunmarshaler_test.go b/core/mapping/yamlunmarshaler_test.go index eef849ac..a9854b89 100644 --- a/core/mapping/yamlunmarshaler_test.go +++ b/core/mapping/yamlunmarshaler_test.go @@ -1011,6 +1011,15 @@ func TestUnmarshalYamlMapRune(t *testing.T) { assert.Equal(t, rune(3), v.Machine["node3"]) } +func TestUnmarshalYamlStringOfInt(t *testing.T) { + text := `password: 123456` + var v struct { + Password string `json:"password"` + } + reader := strings.NewReader(text) + assert.Error(t, UnmarshalYamlReader(reader, &v)) +} + func TestUnmarshalYamlBadInput(t *testing.T) { var v struct { Any string