diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index b7285057d..1ec535d1f 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -752,7 +752,7 @@ func (u *Unmarshaler) processNamedFieldWithValueFromString(fieldType reflect.Typ switch mt := mapValue.(type) { case string: checkValue = mt - case json.Number: + case fmt.Stringer: checkValue = mt.String() default: return fmt.Errorf("the value in map is not string or json.Number, but %s", diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index 83229fd4d..99a0984d8 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -260,7 +260,7 @@ func TestUnmarshalIntWithString(t *testing.T) { } var in inner - assert.Nil(t, UnmarshalKey(m, &in)) + assert.NoError(t, UnmarshalKey(m, &in)) assert.Equal(t, int64(0), in.Int) }) @@ -273,9 +273,37 @@ func TestUnmarshalIntWithString(t *testing.T) { } var in inner - assert.Nil(t, UnmarshalKey(m, &in)) + assert.NoError(t, UnmarshalKey(m, &in)) assert.Equal(t, int64(0), in.Int) }) + + t.Run("int with options", func(t *testing.T) { + type inner struct { + Int int64 `key:"int,string,options=[0,1]"` + } + m := map[string]interface{}{ + "int": nil, + } + + var in inner + assert.Error(t, UnmarshalKey(m, &in)) + }) + + t.Run("int with options", func(t *testing.T) { + type ( + StrType string + + inner struct { + Int int64 `key:"int,string,options=[0,1]"` + } + ) + m := map[string]interface{}{ + "int": StrType("0"), + } + + var in inner + assert.Error(t, UnmarshalKey(m, &in)) + }) } func TestUnmarshalBoolSliceRequired(t *testing.T) {