使用golang版本之间的自定义unmarshaller解析json的差异

时间:2015-12-29 07:01:44

标签: json go

我正在尝试将针对go1.3编写的一些代码移植到当前版本,并遇到版本之间json解析行为不同的情况。我们使用自定义unmarshaller来解析某些特定的日期格式。看起来最近的版本在字符串中传入了附加引号,而1.3则没有。

这是一个错误还是故意改变?在这种情况下,编写与不同版本兼容的代码的最佳方式是什么?只是去寻找使用自定义unmarshaller的所有地方,如果有的话,总是去掉额外的引号?很遗憾必须这样做 - 所以我希望有更好的方法。

package main

import "encoding/json"
import "fmt"
import "time"

type Timestamp1 time.Time

func (t *Timestamp1) UnmarshalJSON(b []byte) (err error) {
    fmt.Println("String to parse as timestamp:", string(b))
    parsedTime, err := time.Parse("2006-01-02T15:04:05", string(b))
    if err == nil {
        *t = Timestamp1(parsedTime)
        return nil
    } else {
        return err
    }
}

type S struct {
    LastUpdatedDate Timestamp1 `json:"last_updated_date,string"`
}

func main() {
    s := `{"last_updated_date" : "2015-11-03T10:00:00"}`
    var s1 S
    err := json.Unmarshal([]byte(s), &s1)
    fmt.Println(err)
    fmt.Println(s1)
}

1 个答案:

答案 0 :(得分:1)

有关于json:",string"标记的a bug已在1.5中修复。如果您没有特殊原因需要,可以将其删除,只需调整格式:

// N.B. time is in quotes.
parsedTime, err := time.Parse(`"2006-01-02T15:04:05"`, string(b))

游乐场:http://play.golang.org/p/LgWuKcPEuI

这应该适用于1.3和1.5。