gpt4 book ai didi

go - json HTTP请求主体验证模式

转载 作者:行者123 更新时间:2023-12-01 22:14:57 24 4
gpt4 key购买 nike

我正在尝试了解用于验证JSON正文的模式。

例如,

  // I have this struct
type Program struct {
ProgramKey string `json:"program_key" validate:"required"`
Active *bool `json:"active" validate:"required"`
}

// json request body
{
"program_key" : "example-key",
"active" : false
}

我想在JSON解码错误消失之前运行请求验证。但是不确定这是否是最好的方法。

因为每当我解码时
   // json request body
{
"program_key" : "example-key",
"active" : "false" // notice the string value here
}
json.NewDecoder(r.Body).Decode(&program);


如果使用者发送的字符串为false,则解码失败。因为JSON解码无法解码和分配请求。我不介意将其用作错误处理/验证的第一层。但鉴于我可以自定义错误消息。我不想向消费者公开API的基本细节。

我在这方面找不到好的模式。

最佳答案

即使json.Decode出错,根据错误,您将结果解析为的结构也可能包含一些结果。从Go文档中,如果您尝试使用错误的json.Decode类型解析JSON字符串,则会返回 UnmarshalTypeError 类型的错误。就像是:

package main

import (
"encoding/json"
"fmt"
)

type Program struct {
ProgramKey string `json:"program_key"`
Active bool `json:"active"`
}

func (p *Program) String() string {
return fmt.Sprintf("&Program{ProgramKey: %s, Active: %t", p.ProgramKey, p.Active)
}

func ParseProgram(jsonStr string) (*Program, error) {
var p *Program
err := json.Unmarshal([]byte(jsonStr), &p)
if err != nil {
switch err.(type) {
case *json.UnmarshalTypeError:
// Maybe log this or build a debug message from it.
fmt.Println(err)
default:
return p, err
}
}
// Inspect P further since it might still contain valid info.
// ...
return p, nil
}

func main() {
jsonStr := `
{
"program_key": "example-key",
"active": "false"
}
`
p, err := ParseProgram(jsonStr)
if err != nil {
panic(err)
}

fmt.Println(p)
}

产生:
json: cannot unmarshal string into Go struct field Program.active of type bool
&Program{ProgramKey: example-key, Active: false

请注意,main中的 p仍然填充了 ProgramKey字段。

关于go - json HTTP请求主体验证模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61004029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com