为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2022-03-03 16:10:52
如何将默认值设置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
查看完整描述

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)

}


查看完整回答
反对 回复 2022-03-03
?
慕标5832272

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


查看完整回答
反对 回复 2022-03-03
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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

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

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

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

  1. 为您的字段提供自定义类型。

    type EncodingMethod string应该做的事情。

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


查看完整回答
反对 回复 2022-03-03
  • 3 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号