登录
首页 >  Golang >  Go问答

Golang / Go - 如何将字段为空的结构转换为 null?

来源:stackoverflow

时间:2024-02-09 13:39:23 296浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Golang / Go - 如何将字段为空的结构转换为 null?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我知道这可能看起来是一个常见问题,但对我来说……

我有一个结构,其中一个字段类型等于另一个结构的字段类型:

type developer struct {
    name       string `json:"name,omitempty"`
    projectref *ref   `json:"project,omitempty"`
}

type ref struct {
    id string `json:"id,omitempty"`
}

在我的实现中,我无法保证是否存在开发人员的 projectref。如果我创建一个带有空id(即空字符串)的ref,那么该字段将从ref中省略,但是,即使我的ref此时没有字段,为什么它没有被省略为空?

我想克服这个问题的一种方法是使用一堆条件语句,但我不想让自己这样做,因为我有很多需要此功能的情况。

完整演示代码:

package main

import (
    "encoding/json"
    "fmt"
)

type Developer struct {
    Name       string `json:"name,omitempty"`
    ProjectRef *Ref   `json:"project,omitempty"`
}

type Ref struct {
    ID string `json:"id,omitempty"`
}

func main() {
    developer := &Developer{
        Name:       "Charlie",
        ProjectRef: &Ref{ID: ""},
    }

    jsonBytes, err := json.Marshal(developer)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(jsonBytes))
// {"name":"Charlie","project":{}}
}

演示链接:https://go.dev/play/p/d2edbracxy2

提前谢谢


正确答案


即使所有字段都包含 zero values,结构也会被编组。

一种方法是保留 developer.projectref 字段 nil,并删除 omitempty 属性。这样它将被编组到 json null 值中:

type developer struct {
    name       string `json:"name,omitempty"`
    projectref *ref   `json:"project"`
}

测试它:

developer := &developer{
    name:       "charlie",
}

jsonbytes, err := json.marshal(developer)
if err != nil {
    panic(err)
}
fmt.println(string(jsonbytes))

developer.projectref = &ref{id: "abc"}

jsonbytes, err = json.marshal(developer)
if err != nil {
    panic(err)
}
fmt.println(string(jsonbytes))

输出(在 Go Playground 上尝试):

{"name":"charlie","project":null}
{"name":"charlie","project":{"id":"abc"}}

如果您始终希望 developer.projectref 成为非 nil 指针,请为 ref 编写自定义 JSON marshaler,如果 id 为空,它可以封送 json null 值:

func (r *ref) marshaljson() ([]byte, error) {
    if r.id == "" {
        return []byte("null"), nil
    }
    type ref2 ref
    return json.marshal((*ref2)(r))
}

测试它:

developer := &developer{
    name:       "charlie",
    projectref: &ref{id: ""},
}

jsonbytes, err := json.marshal(developer)
if err != nil {
    panic(err)
}
fmt.println(string(jsonbytes))

developer.projectref.id = "abc"

jsonbytes, err = json.marshal(developer)
if err != nil {
    panic(err)
}
fmt.println(string(jsonbytes))

输出(在 Go Playground 上尝试):

{"name":"charlie","project":null}
{"name":"charlie","project":{"id":"abc"}}

今天关于《Golang / Go - 如何将字段为空的结构转换为 null?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>