3 回答

TA贡献1775条经验 获得超11个赞
您可以在初始化“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)
}

TA贡献1966条经验 获得超4个赞
由于您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
}
现在,当您使用空值对 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

TA贡献1876条经验 获得超7个赞
你不能因为在 Go 中类型没有构造函数。
相反,要么有一个显式的初始化函数(或指针接收器上的方法),要么有一个构造函数/工厂函数(这些通常被称为New<TypeName>
你NewFileData
的),这将返回你的类型的初始化值。
总而言之,我觉得这看起来像是一个 XY 问题。从您的问题来看,如果没有任何未编组的内容,您似乎希望在其中一个字段上设置默认值。如果是这样,只需对从 JSON 解组的这种类型的值进行后处理,如果没有解Encodning
组,则将其设置为您想要的任何默认值。
或者,您可以考虑这种方法:
为您的字段提供自定义类型。
type EncodingMethod string
应该做的事情。为这种类型有一个自定义的 JSON 解组方法,可以做任何它想要的处理。
- 3 回答
- 0 关注
- 242 浏览
添加回答
举报