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

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

问题描述:

I am trying to port some code written against go1.3 to current versions and ran into a case where the json parsing behavior is different between versions. We are using a custom unmarshaller for parsing some specific date format. It looks like recent versions pass in the string with additional quotes which 1.3 did not.

Is this a bug or an intentional change? And whats the best way of writing code which is compatible with different versions in this situation. Just go looking for all places where a custom unmarshaller is in use always strip out extra quotes if any? It would be a pity to have to do that - so I am hoping there is a better way.

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)
}

There was a bug concerning json:",string" tag that was fixed in 1.5. If there isn't a particular reason you need it, you can remove it and simply adjust your format:

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

Playground: http://play.golang.org/p/LgWuKcPEuI.

This should work in 1.3 as well as 1.5.