使用`encoding/json`的默认值golang结构?

如何将默认值设置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


交互式爱情
浏览 243回答 3
3回答

繁星淼淼

您可以在初始化“FileData”时设置默认值参见我的示例: https: //play.golang.org/p/QXwDG7_mulPage int具有默认值 33package mainimport (    "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)}

慕标5832272

由于您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 Encodingfunc (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}现在,当您使用空值对 json 进行编码时Encoding,它将被设置为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工作代码: https: //play.golang.org/p/y5_wBgHGJk

幕布斯6054654

你不能因为在 Go 中类型没有构造函数。相反,要么有一个显式的初始化函数(或指针接收器上的方法),要么有一个构造函数/工厂函数(这些通常被称为New<TypeName>你NewFileData的),这将返回你的类型的初始化值。总而言之,我觉得这看起来像是一个 XY 问题。从您的问题来看,如果没有任何未编组的内容,您似乎希望在其中一个字段上设置默认值。如果是这样,只需对从 JSON 解组的这种类型的值进行后处理,如果没有解Encodning组,则将其设置为您想要的任何默认值。或者,您可以考虑这种方法:为您的字段提供自定义类型。type EncodingMethod string应该做的事情。为这种类型有一个自定义的 JSON 解组方法,可以做任何它想要的处理。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go