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

Jag*_*row 8 go

如何设置默认值为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"`
}
Run Code Online (Sandbox Code Playgroud)

我试过了

Encoding string `json:encoding`= "base64" // Not working
Run Code Online (Sandbox Code Playgroud)

小智 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)
}

  • 对于数组大小未知的 jsons 的解决方案是什么? (5认同)

abh*_*ink 6

由于您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
}
Run Code Online (Sandbox Code Playgroud)

现在,当您使用空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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

{UID 10 CONTENT ASCII qwe} ASCII
{UID 10 CONTENT base64 qwe} base64
Run Code Online (Sandbox Code Playgroud)

工作代码:https//play.golang.org/p/y5_wBgHGJk


kos*_*tix 5

你不能,因为在 Go 中类型没有构造函数。

相反,有一个显式的初始化函数(或指针接收器上的方法)或一个构造函数/工厂函数(这些函数通常被调用,New<TypeName>所以你的将是NewFileData),它们将返回你的类型的初始化值。

总而言之,我有一种感觉,这看起来像是一个 XY 问题。从您的问题来看,如果没有解组任何内容,您似乎希望在其中一个字段上设置默认值。如果是这样,只需对从 JSON 解Encodning组的这种类型的值进行后处理,如果没有解组,则将其设置为您想要的任何默认值。

或者,您可以考虑这种方法:

  1. 为您的字段设置自定义类型。

    type EncodingMethod string应该做的事情。

  2. 为这种类型有一个自定义的 JSON 解组方法,它可以做任何它想做的处理。