将类型编码为JSON时,将字符串附加到成员

时间:2015-05-12 16:00:36

标签: json go

我有一个名为“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
post.Url = fmt.Sprintf("%s%s", HOST, post.Url)

但是,如果我每次想要编码为json时都要记得重新分配,那感觉有点乱。

我不想更改post.Url的值,我只想更改它表示为json的方式。

1 个答案:

答案 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"}
}

Playground

(另请注意,使用常量的所有上限为not idiomaticgolint推荐URLMyURLHTTPID vs UrlMyUrlId)。