如何将Encoding
的默认值设置为" base64"?
type FileData struct {
UID string `json:"uid"`
Size int `json:"size"`
Content string `json:content`
Encoding string `json:encoding`
User string `json:"user"`
}
我试过
Encoding string `json:encoding`= "base64" // Not working
答案 0 :(得分:9)
您可以在初始化' FileData'时设置默认值
请参阅我的示例:https://play.golang.org/p/QXwDG7_mul
Page int
的默认值为33
package main import ( "encoding/json" "fmt" ) type Response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"` } func main() { str := `{"fruits": ["apple", "peach"]}` res := Response2{Page: 33 /*Default value*/} json.Unmarshal([]byte(str), &res) fmt.Println(res) }
答案 1 :(得分:5)
由于FileData
过于复杂,您可以轻松使用json.Unmarshaler
界面。将Encoding
声明为单独的类型,并在unmarshal方法中设置默认值:
type FileData struct {
UID string `json:"uid"`
Size int `json:"size"`
Content string `json:content`
Encoding Encoding `json:encoding` // declared as a custom type
User string `json:"user"`
}
type Encoding string
// implement the Unmarshaler interface on Encoding
func (e *Encoding) UnmarshalJSON(b []byte) error {
var s string
if err := json.Unmarshal(b, &s); err != nil {
return err
}
if s == "" {
*e = Encoding("base64")
} else {
*e = Encoding(s)
}
return nil
}
现在,当您对具有空Encoding
值的json进行编码时,它将被设置为base64
:
var data1 = []byte(`{"uid": "UID", "size": 10, "content": "CONTENT", "encoding": "ASCII", "user": "qwe"}`)
var data2 = []byte(`{"uid": "UID", "size": 10, "content": "CONTENT", "encoding": "", "user": "qwe"}`)
func main() {
fmt.Println("Hello, playground")
f := FileData{}
if e := json.Unmarshal(data1, &f); e != nil {
fmt.Println("Error:", e)
}
fmt.Println(f, f.Encoding)
if e := json.Unmarshal(data2, &f); e != nil {
fmt.Println("Error:", e)
}
fmt.Println(f, f.Encoding)
}
<强>输出:强>
{UID 10 CONTENT ASCII qwe} ASCII
{UID 10 CONTENT base64 qwe} base64
答案 2 :(得分:4)
你不能因为在Go类型中没有构造函数。
相反,有一个显式初始化函数(或指针接收器上的方法)或构造函数/工厂函数(这些通常称为New<TypeName>
,所以你的NewFileData
)将返回初始化你的类型的价值。
总而言之,我觉得这看起来像是一个XY问题。根据您的问题,如果没有任何解组,您似乎希望在其中一个字段上使用默认值。
如果是这样,只需对从JSON中解组的此类型的值进行后处理,如果没有任何内容被解组为Encodning
,则将其设置为您想要的任何默认值。
或者您可以考虑这种方法:
为您的字段设置自定义类型。
type EncodingMethod string
之类的东西应该这样做。
为此类型提供自定义JSON解组方法,可以执行任何处理。
答案 3 :(得分:0)
如果需要从环境变量中读取结构体值,则可以使用“github.com/kelseyhightower/envconfig”库,然后您可以如下声明您的结构体:
type FileData struct {
UID string `envconfig:"uid"`
Size int `envconfig:"size"`
Content string `envconfig:content`
Encoding string `envconfig:encoding default:"base64"`
User string `envconfig:"user"`
}
您终于可以将 JSON 解组到您的结构中。
注意:我知道这不是您所要求的,但这可能会对某人有所帮助。