我有一个名为“Url”的值成员。将此类型编码为json时,我想在Url前面添加HOST值。实现这一目标的最佳方法是什么?
在此示例中,Println
语句打印{"url":"/thisurl"}
,我希望它打印{"url":"http://myhost.com/thisurl"}
package main
import "fmt"
import "encoding/json"
type Post struct {
Url string `json:"url"`
}
const (
HOST = "http://myhost.com"
)
func main() {
post := Post{"/thisurl"}
marshaled, _ := json.Marshal(post)
fmt.Println(string(marshaled))
//{"url":"/thisurl"}
}
我可以在json.Marshal
行
post.Url = fmt.Sprintf("%s%s", HOST, post.Url)
但是,如果我每次想要编码为json时都要记得重新分配,那感觉有点乱。
我不想更改post.Url
的值,我只想更改它表示为json的方式。
答案 0 :(得分:3)
如果要更改(联合国)编组行为,请使用实现json.Marshaler
(可能还有json.Unmarshaler
)的自定义类型。
package main
import (
"encoding/json"
"fmt"
)
type Post struct {
URL URLString `json:"url"`
}
const (
Host = "http://myhost.com"
)
type URLString string
func (u URLString) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`"%s%s"`, Host, u)), nil
}
func main() {
post := Post{"/thisurl"}
marshaled, _ := json.Marshal(post)
fmt.Println(string(marshaled))
//{"url":"http://myhost.com/thisurl"}
}
(另请注意,使用常量的所有上限为not idiomatic,golint
推荐URL
,MyURL
,HTTP
,ID
vs Url
,MyUrl
或Id
)。