我正在尝试将针对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)
}
答案 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。