あなたFileData
があまりにも複雑ではありませんので、あなたは簡単にjson.Unmarshaler
インターフェースを利用することができます。セパレートタイプとしてEncoding
を宣言し、アンマーシャリング方法でデフォルト値を設定する:あなたは空のEncoding
値とJSONをエンコードするとき
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
}
は今、それが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
アレイとスライスの値は、[ことを除いて、JSON配列としてエンコードしています]バイトはbase64でエンコードされた文字列としてエンコードされ、nilスライスはnullのJSON値としてエンコードされます。 https://golang.org/pkg/encoding/json/ – foecum
[GoでJSONを解析する際にデフォルト値を指定する方法](https://stackoverflow.com/questions/30445479/how-指定時のデフォルト値 - 解析時 - json-in-go) – vergenzt