mapstructure icon indicating copy to clipboard operation
mapstructure copied to clipboard

The time.Time type is converted to empty map

Open van-scott opened this issue 2 years ago • 6 comments

type Person struct { Name string json:"name" Age int json:"age" Time time.Time json:"time" Address Address json:"address" }

Why a time.Time type has to be converted to map, not recursive transfer is not on the line, configuration is not, read a lot of posts, what hook, hook function is not good. I recommend using the github.com/fatih/structs library, I really buy it

van-scott avatar Jun 16 '23 02:06 van-scott

could time.Time be transformed into a RFC3339 string rather than an empty map in the same way as what is done for a time.Duration which is converting into its string representation?

acabarbaye avatar Jun 27 '23 14:06 acabarbaye

Same problem

GiGurra avatar Nov 10 '23 10:11 GiGurra

converting time to time also doesn't work for me, I have this failing test to demonstrate


func TestDecoder_timeStructs(t *testing.T) {
	type Input struct {
		TheTime time.Time
	}
	timeNow := time.Now()
	input := &Input{
		TheTime: timeNow,
	}

	type Output struct {
		TheTime time.Time
	}

	actual := &Output{}
	config := &DecoderConfig{
		Result:               &actual,
		IgnoreUntaggedFields: true,
	}

	decoder, err := NewDecoder(config)
	if err != nil {
		t.Fatalf("err: %s", err)
	}

	err = decoder.Decode(input)
	if err != nil {
		t.Fatalf("err: %s", err)
	}

	expected := Output{
		TheTime: timeNow,
	}

	if !reflect.DeepEqual(expected, actual) {
		t.Fatalf("Decode() expected: %#v\ngot: %#v", expected, actual)
	}
}
--- FAIL: TestDecoder_timeStructs (0.00s)
    /Users/danny/Code/go/src/github.com/mitchellh/mapstructure/mapstructure_test.go:2768: Decode() expected: mapstructure.Output{TheTime:time.Date(2023, time.December, 8, 20, 0, 27, 838026000, time.Local)}
        got: &mapstructure.Output{TheTime:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)}

danhawkins avatar Dec 08 '23 16:12 danhawkins

converting time to time also doesn't work for me, I have this failing test to demonstrate

func TestDecoder_timeStructs(t *testing.T) {
	type Input struct {
		TheTime time.Time
	}
	timeNow := time.Now()
	input := &Input{
		TheTime: timeNow,
	}

	type Output struct {
		TheTime time.Time
	}

	actual := &Output{}
	config := &DecoderConfig{
		Result:               &actual,
		IgnoreUntaggedFields: true,
	}

	decoder, err := NewDecoder(config)
	if err != nil {
		t.Fatalf("err: %s", err)
	}

	err = decoder.Decode(input)
	if err != nil {
		t.Fatalf("err: %s", err)
	}

	expected := Output{
		TheTime: timeNow,
	}

	if !reflect.DeepEqual(expected, actual) {
		t.Fatalf("Decode() expected: %#v\ngot: %#v", expected, actual)
	}
}
--- FAIL: TestDecoder_timeStructs (0.00s)
    /Users/danny/Code/go/src/github.com/mitchellh/mapstructure/mapstructure_test.go:2768: Decode() expected: mapstructure.Output{TheTime:time.Date(2023, time.December, 8, 20, 0, 27, 838026000, time.Local)}
        got: &mapstructure.Output{TheTime:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)}

It also doesn't work for me; I hope it will soon support this case.

dangquyitt avatar Dec 29 '23 01:12 dangquyitt

I am also running into this with a function for a project I'm working on. Maybe this will be handled in go-viper/mapstructure? Will open an issue there

garrettladley avatar May 13 '24 01:05 garrettladley

I'm experiencing the same issue.

sheregeda avatar May 24 '24 11:05 sheregeda