当前位置: 首页 > 知识库问答 >
问题:

如何在将json解组到结构时不允许空字段

严昀
2023-03-14

我确实有这个要求

type RequestBody struct {
    ForkliftID  string `json:"forklift_id"`
    WarehouseID string `json:"warehouse_id,omitempty"`
    TaskID      string `json:"task_id"`
}

如果我没有在json请求正文中发送“forkfork_id”,则解组会在不返回错误的情况下分配“”,我想知道是否有类似的情况

`json: "forklift_id,notempty"`

因此,如果字段不存在或为空,则解组返回错误。

提前谢谢

共有2个答案

罗茂实
2023-03-14

将字段类型更改为*String。解组后,如果值为nil,则您知道没有提供JSON字段。

有关解封错误检查的更全面示例,请参阅此处。

赵炯
2023-03-14

我假设您所做的(将有效负载中的空值视为错误)是为了验证目的。如果是这样,我认为你可以使用@colminator-answer,或者尝试使用第三方库来解决这个特殊问题。一个例子是https://github.com/go-playground/validator.

type RequestBody struct {
    ForkliftID  string `json:"forklift_id"  validate:"required"`
    WarehouseID string `json:"warehouse_id" validate:"required"`
    TaskID      string `json:"task_id"`
}

// ...

var payload RequestBody 

// ...

validate := validator.New()
err := validate.Struct(payload)
if err != nil {
    // handle the error
}

带有标签validate:“required”的字段将在validate时进行验证。调用Struct()

除了必需的之外,还有很多有用的验证规则可用。

有关更详细的示例,请查看示例源代码

另一种解决方案是,对这些结构的字段执行显式检查。例如:

golang prettyprint-override">// ...

if payload.ForkliftID == "" {
     err = fmt.Errorf("Forklift ID cannot be empty")
}
if payload.WarehouseID == "" {
     err = fmt.Errorf("Warehouse ID cannot be empty")
}
 类似资料:
  • 问题内容: 我有一个这样的结构: 但是,即使MyStruct实例完全为空(意味着所有值都是默认值),它也会被序列化为: 我知道encoding / json文档指定“空”字段为: false,0,任何nil指针或接口值以及任何长度为零的数组,切片,映射或字符串 但不考虑具有所有空/默认值的结构。它的所有字段也都标有,但这无效。 如何获取JSON包以 不 封送我的字段为空结构? 问题答案: 正如文档

  • 问题内容: 我想将以下JSON解组到结构中: 我试图以各种方式修改,但是结构始终为空: 输出: 过去使用的JSON没有括号,因此我怀疑问题与它们有关。 有人可以帮忙吗? https://play.golang.org/p/pymKbOqcM- 问题答案: 发生这种情况是因为其他包()无法访问私有字段(即使具有反射)。在私有语言中,私有字段是以小写字母开头的字段。要解决此问题,请使您的结构包含公共字

  • 我有一个这样的结构: 但是,即使MyStruct的实例完全为空(也就是说,所有值都是默认值),它也被序列化为: 我知道编码/json文档指定“空”字段是: false、0、任何nil指针或接口值,以及任何长度为零的数组、切片、映射或字符串 但不考虑所有空/默认值的结构。它的所有字段也用标记,但这没有效果。 如何让JSON包不封送我的空结构字段?

  • 问题内容: 我正在尝试在Go中解码一些json,但某些字段不会被解码。在此处查看在浏览器中运行的代码: 我究竟做错了什么? 我只需要MX记录,所以没有定义其他字段。据我从godoc了解到,您不需要定义不需要/不需要的字段。 问题答案: 按照有关json.Unmarshal的go documentaiton 所述,您只能对导出的字段进行解码,主要原因是外部软件包(例如)无法访问未导出的字段。 如果您

  • 问题内容: 如何使用T-SQL更改表中的一个属性以允许为null(不为null-> null)?也许更改表? 问题答案:

  • 问题内容: 我是初学者,尝试解组以下json字符串 这是结构 这是功能 该函数正在返回 问题答案: 您的JSON输入不是的一部分,因为还有另一个JSON对象包装器,并且值属于属性。 更深入地讲,是一个JSON数组,其中的对象持有不同的键,其值可由表示。 因此,要完全描述您的JSON,您需要某种“动态”类型。例如,地图就是这种动态类型。 因此,您的原始JSON输入可以使用类型完全建模。这是一张地图,