Go 实现JSON封送器接口时获取标记

Go 实现JSON封送器接口时获取标记,go,Go,在封送下面的Foo实例时,在实现JSON封送器接口时,我们如何获得标记信息?注意,我们还可以有一个也使用MyNullString的Bar结构。因此,我们不能假设MyNullString仅由Foo struct使用 包干管 import ( "fmt" "database/sql" "encoding/json" ) type MyNullString struct { sql.NullString } type Foo struct { MyInt int64

在封送下面的Foo实例时,在实现JSON封送器接口时,我们如何获得标记信息?注意,我们还可以有一个也使用MyNullString的Bar结构。因此,我们不能假设MyNullString仅由Foo struct使用

包干管

import (
  "fmt"
  "database/sql"
  "encoding/json"
)
type MyNullString struct {
   sql.NullString
}

type Foo struct {
    MyInt int64
    MyString MyNullString `json:"my_string,omitempty"` 
}

func (s *MyNullString) MarshalJSON() ([]byte, error){
    //Inspect tag of struct instance and see if this field has to be omitted when empty
    //HOW?????
    //Note: We can use MyNullString in other structs as well. 
}

func main(){
   foo := Foo{MyInt: 1}
   data, _ := json.Marshal(&foo)
   fmt.Println(string(data))
}

类型不可能检查包含它的其他类型/值(您看不到您所在的框,但可以看到您所在的框)。有一个对自定义空支持的开放特性请求,这样类型可以通知编码器它是一个“空”值,但此时没有可用的。请参见

查看
reflect
包,特别是从结构中提取
StructField
的示例。您可以阅读json实现,看看它们做了什么。这很简单。我想你必须在结构本身上实现
MarshalJSON
。好吧!我想我们得等到那时。