当前位置: 首页 > 面试题库 >

如何在Go中使用非必需的JSON参数?

窦涵忍
2023-03-14
问题内容

嗨,我正在Go中使用rest API,我希望用户传递JSON参数:

Offset int64  `json:"offset"`
Limit  int64  `json:"limit"`
SortBy string `json:"sortby"`
Asc    bool   `json:"asc"`
Username   string `json:"username"`
First_Name string `json:"first_name"`
Last_Name  string `json:"last_name"`
Status     string `json:"status"`

但是它们并非总是必需的,例如,用户只能通过Offset而忽略其他用户。他甚至可以发送0个参数。我怎样才能做到这一点?


问题答案:

从JSON文本解组值时,json程序包不需要所有字段都以JSON形式出现,也不需要所有JSON字段都具有匹配的Go字段。

因此,您没有什么特别的事情要做,只需解组您必须拥有的东西,以获取您想要或可能想要的价值。

需要注意的一件事是,如果JSON文本中缺少字段,则json包将不会更改相应的Go字段,因此,如果您以“
fresh”(零)开头,则该字段将保留其零值。类型。

在大多数情况下,这足以检测字段的存在或不存在(在JSON中),例如,如果在Go
struct中您有一个SortBy类型的字段string,如果在JSON中缺少此字段,则它将保持为空string""

如果零值有用且有效,那么您可以转向使用指针。例如,如果在您的应用程序中,empty
string为有效值SortBy,则可以将该字段声明为指针:*string。并且在这种情况下,如果JSON文本中缺少nil该值,则它将保留为任何指针类型的零值。

请参阅以下示例:

type Data struct {
    I int
    S string
    P *string
}

func main() {
    var d Data
    var err error

    d, err = Data{}, nil
    err = json.Unmarshal([]byte(`{"I":1, "S":"sv", "P":"pv"}`), &d)
    fmt.Printf("%#v %v\n", d, err)

    d, err = Data{}, nil
    err = json.Unmarshal([]byte(`{"I":1}`), &d)
    fmt.Printf("%#v %v\n", d, err)

    d, err = Data{}, nil
    err = json.Unmarshal([]byte(`{"S":"abc"}`), &d)
    fmt.Printf("%#v %v\n", d, err)
}

输出(在Go Playground上尝试):

main.Data{I:1, S:"sv", P:(*string)(0x1050a150)} <nil>
main.Data{I:1, S:"", P:(*string)(nil)} <nil>
main.Data{I:0, S:"abc", P:(*string)(nil)} <nil>


 类似资料:
  • 问题内容: 我们使用“从Java开始”方法来使用Metro 1.5堆栈创建JAX-WS 2.0 Web服务。当我们将诸如SoapUI的标准工具指向我们的一个Web服务时,它表明WebMethods的参数是可选的。生成的xsd显示minOccurs = 0。 我需要一种方法来使“从Java出发”方法中需要WebMethod参数(也许在xsd中为minOccurs = 1)。我认为这有一个Java注释

  • 我已经做了不少搜索。但是,仍然对包中的“main”参数有疑问。节点项目的json。 填写此字段有何帮助?以另一种方式询问,如果此字段出现,我是否可以以不同的方式启动模块 我知道第二个问题很奇怪。这是因为我在OpenShift上托管了一个Node.js应用程序,但该应用程序由两个主要组件组成。一个是REST API,一个是通知传递服务。 我担心,如果REST API是作为单个线程实现的,那么通知传递

  • 问题内容: 我正在使用Go中的json结构输入流。我从标准输入上的另一个应用程序接收输入流,并且无法更改通信协议。 我的问题是每个json结构都以非json字符串行终止:“ end”(不带引号)。 我正在使用Golang编码器/ json包来解码从stdin接收到的json。问题在于,第二次我使用msg调用解码器时,解码器会产生错误:“无效字符’e’正在寻找值的开头”。 问题当然是,“ end”字

  • 问题内容: 我如何在我的Web服务中使用json参数,我可以使用@PathParam获取参数,但是获取json数据作为参数却不知道该怎么做。 } 用什么代替@PathParam以及以后如何解析。 问题答案: 我假设您正在谈论使用随请求发送的JSON消息正文。 如果是的话,请注意,虽然不是完全禁止的,有一个普遍的共识是GET请求应该 不会 有请求主体。有关原因的说明,请参见“ 带有请求正文的HTTP

  • 问题内容: 在python中,您可以按以下顺序生成带有键的JSON: 我在Go中找不到类似的选项。有什么想法可以在旅途中实现类似的行为吗? 问题答案: json包在编组时总是对密钥进行排序。特别: 地图按字典顺序对键进行排序 结构键按照结构中定义的顺序编组 该实现位于此处的ATM中: http://golang.org/src/pkg/encoding/json/encode.go?#L359

  • 问题内容: 如果我将@Builder添加到类中。创建了builder方法。 我有一个需要特定字段的要求。在这种情况下,名称字段是必填字段,而不是姓氏。理想情况下,我想这样声明。 我不知道该怎么做。我尝试将@Builder添加到构造函数中,但没有成功。 问题答案: 您可以使用Lombok批注配置轻松完成此操作 然后像那样使用 当然这里是可选的。