为什么去UnmarshalJSON接收Json对象而不仅仅是值

时间:2016-09-06 09:51:39

标签: json go

我有以下自定义类型:

type TimeWithoutZone struct {
    time.Time
}

Marshaling工作正常:

const timeWithoutZoneFormat = "2006-01-02T15:04:05"
func (t *TimeWithoutZone) MarshalJSON() ([]byte, error) {
    stamp := fmt.Sprintf(`"%s"`, t.Time.Format(timeWithoutZoneFormat ))
    return []byte(stamp), nil
}

但是这里的日期无法解析:

func (t *TimeWithoutZone) UnmarshalJSON(data []byte) (err error) {
    log.Println("Parsing: " + string(data))
    t.Time, err = time.Parse(`"` + timeWithoutZoneFormat + `"`, string(data))

    if err != nil {
        return err
    }
    return nil
}

它记录:Parsing: {"time":"2016-09-06T11:06:16"}但我希望它只解析time

的值

我做错了什么?这是相关的测试:

type TimeTestObj struct {
    Time TimeWithoutZone `json:"time"`
}

func TestParseDataWithoutTimezone(t *testing.T) {
    parsed := TimeWithoutZone{}

    data := `{"time":"2016-09-06T11:06:16"}`
    err := json.Unmarshal([]byte(data), &parsed)

    if err != nil {
        t.Error(err)
    }

    if parsed.Unix() != 1473152776 {
        t.Error(parsed.Unix(), "!=", 1473152776)
    }
}

我找到的所有示例,甚至来自Go time包的默认解析器似乎都是这样工作......

1 个答案:

答案 0 :(得分:1)

哇,我在这一行中输错了类型:

parsed := TimeWithoutZone{}

必须是

parsed := TimeTestObj{}

...