print lab handling golang deserialize json time go marshalling

lab - Reemplace el diseño utilizado por json.Marshal para formatear la hora.



print json golang (3)

En Golang, ¿hay alguna manera de hacer que la encoding/json genérica encoding/json Marshal use un diseño diferente cuando se calcula el time.Time ? ¿Campos de tiempo?

Básicamente tengo esta estructura:

s := {"starttime":time.Now(), "name":"ali"}

y quiero codificar para json usando la función Marshal encdoding/json , pero quiero usar mi diseño personalizado, me imagino que en algún time.Format(layout) Se está llamando al time.Format(layout) , quiero controlar ese diseño,


Como inspirado por la respuesta de zeebo y resumido en los comentarios a esa respuesta:

http://play.golang.org/p/pUCBUgrjZC

package main import "fmt" import "time" import "encoding/json" type jsonTime struct { time.Time f string } func (j jsonTime) format() string { return j.Time.Format(j.f) } func (j jsonTime) MarshalText() ([]byte, error) { return []byte(j.format()), nil } func (j jsonTime) MarshalJSON() ([]byte, error) { return []byte(`"` + j.format() + `"`), nil } func main() { jt := jsonTime{time.Now(), time.Kitchen} if jt.Before(time.Now().AddDate(0, 0, 1)) { // 1 x := map[string]interface{}{ "foo": jt, "bar": "baz", } data, err := json.Marshal(x) if err != nil { panic(err) } fmt.Printf("%s", data) } }

Esta solución integra el tiempo. Tiempo en la estructura jsonTime. La incrustación promueve todos los métodos time.Time a la estructura jsonTime, lo que permite su uso sin conversión explícita de tipo (ver // 1).

Incrustar un tiempo. El tiempo tiene la desventaja de promover también el método MarshalJSON, que el código de codificación / json calcula más alto que el método MarshalText por razones de compatibilidad con versiones anteriores ( MarshalText se agregó en Go 1.2 , MarshalJSON es anterior a eso). Como resultado, se utiliza el formato predeterminado de hora y tiempo. En lugar de un formato personalizado provisto por MarshalText.

Para superar este problema, reemplazamos a MarshalJSON por la estructura jsonTime.


Primero, recomiendo no usar un formato de hora que no sea el predeterminado RFC3339. Es un buen formato de tiempo, y puede ser analizado por cualquier cantidad de idiomas, por lo tanto, a menos que necesite un formato diferente porque la API de otra persona lo requiere, probablemente sea mejor usar el predeterminado.

Pero tuve que resolver este problema al consumir las API de otras personas, así que aquí hay una solución que cambia la mayor parte del trabajo al paso Mariscal / Unmarshal y te deja con una estructura ideal: http: //play.golang. .org / p / DKaTbV2Zvl


Tal vez algo como esto funcionará para ti?

package main import "fmt" import "time" import "encoding/json" type jsonTime struct { t time.Time f string } func (j jsonTime) MarshalText() ([]byte, error) { return []byte(j.t.Format(j.f)), nil } func main() { x := map[string]interface{}{ "foo": jsonTime{t: time.Now(), f: time.Kitchen}, "bar": "baz", } data, err := json.Marshal(x) if err != nil { panic(err) } fmt.Printf("%s", data) }

también disponible aquí: http://play.golang.org/p/D1kq5KrXQZ

Simplemente haga un tipo personalizado que implemente MarshalText de la forma que desee que aparezca.