如何跳过json.Marshal&;的字段;不适用于json.Unmarshal中的go?
当我执行json.Marshal时,是否可以忽略SkipWhenMarshal字段,但当我执行json.Marshal时,是否可以忽略该字段 json.Unmarshal。 它应该适用于任何调用MarshalJSON字段标记修饰符(如“省略空”和“-”)的类型,这些修饰符同时应用于封送和解封,因此没有自动方式 您可以为您的类型实现一个如何跳过json.Marshal&;的字段;不适用于json.Unmarshal中的go?,json,go,go-gorm,golang-migrate,google-app-engine-golang,Json,Go,Go Gorm,Golang Migrate,Google App Engine Golang,当我执行json.Marshal时,是否可以忽略SkipWhenMarshal字段,但当我执行json.Marshal时,是否可以忽略该字段 json.Unmarshal。 它应该适用于任何调用MarshalJSON字段标记修饰符(如“省略空”和“-”)的类型,这些修饰符同时应用于封送和解封,因此没有自动方式 您可以为您的类型实现一个MarshalJSON,忽略您需要的任何字段。无需实现自定义解组器,因为默认值适用于您 例如,类似这样的事情: type Alpha struct { Nam
MarshalJSON
,忽略您需要的任何字段。无需实现自定义解组器,因为默认值适用于您
例如,类似这样的事情:
type Alpha struct {
Name string `json:"name"`
SkipWhenMarshal string `json:"skipWhenMarshal"`
}
func MarshalJSON(out interface{}){
json.Marshal(out)
}
您还可以使用别名类型使其更简单:
type Alpha struct {
Id int32
Name string
SkipWhenMarshal string
}
func (a Alpha) MarshalJSON() ([]byte, error) {
m := map[string]string{
"id": fmt.Sprintf("%d", a.Id),
"name": a.Name,
// SkipWhenMarshal *not* marshaled here
}
return json.Marshal(m)
}
此处将输出SkipWhenMarshal
,但其值已调零。这种方法的优点是,如果Alpha
有许多字段,则不必重复它们。字段标记修饰符,如“省略空”和“-”同时应用于封送和解封,因此没有自动方法
您可以为您的类型实现一个MarshalJSON
,忽略您需要的任何字段。无需实现自定义解组器,因为默认值适用于您
例如,类似这样的事情:
type Alpha struct {
Name string `json:"name"`
SkipWhenMarshal string `json:"skipWhenMarshal"`
}
func MarshalJSON(out interface{}){
json.Marshal(out)
}
您还可以使用别名类型使其更简单:
type Alpha struct {
Id int32
Name string
SkipWhenMarshal string
}
func (a Alpha) MarshalJSON() ([]byte, error) {
m := map[string]string{
"id": fmt.Sprintf("%d", a.Id),
"name": a.Name,
// SkipWhenMarshal *not* marshaled here
}
return json.Marshal(m)
}
此处将输出
SkipWhenMarshal
,但其值已调零。这种方法的优点是,如果Alpha
有许多字段,则不必重复它们。编码/json无法实现您想要的功能
但是您可以有两种类型
func (a Alpha) MarshalJSON() ([]byte, error) {
type AA Alpha
aa := AA(a)
aa.SkipWhenMarshal = ""
return json.Marshal(aa)
}
使用AlphaIn
将JSON与encoding/JSON.Unmarshal反序列化,并使用AlphaOut
将结构与encoding/JSON.Marshal序列化为JSON
现在,仅此一点就绝对难以处理,但是:结构标记在类型之间的可转换性中不起作用,它允许您通过简单的类型转换从AlphaIn转换为AlphaOut:
type AlphaIn struct {
Name string `json:"name"`
Bar string `json:"skipWhenMarshal"`
}
type AlphaOut struct {
Name string `json:"name"`
Bar string `json:"-"`
}
(一个更合理的命名方案应该是
Alpha
和AlphaToJSON
或诸如此类的东西。)编码/json无法满足您的需求
但是您可以有两种类型
func (a Alpha) MarshalJSON() ([]byte, error) {
type AA Alpha
aa := AA(a)
aa.SkipWhenMarshal = ""
return json.Marshal(aa)
}
使用AlphaIn
将JSON与encoding/JSON.Unmarshal反序列化,并使用AlphaOut
将结构与encoding/JSON.Marshal序列化为JSON
现在,仅此一点就绝对难以处理,但是:结构标记在类型之间的可转换性中不起作用,它允许您通过简单的类型转换从AlphaIn转换为AlphaOut:
type AlphaIn struct {
Name string `json:"name"`
Bar string `json:"skipWhenMarshal"`
}
type AlphaOut struct {
Name string `json:"name"`
Bar string `json:"-"`
}
(更合理的命名方案应该是
Alpha
和AlphaToJSON
或类似的soemthing。)我将编写一个自定义封送处理函数,如下所示:
因为这只假设您只有字符串或整数作为字段。处理更多类型会更理想。我会编写一个自定义封送处理函数,如下所示:
因为这只假设您只有字符串或整数作为字段。处理更多类型会更理想。您可以尝试这样做,即将结构分解为组件->组合 解组时使用Beta类型。它将仅解组Beta struct中定义的字段
switch val := intf.(type) {
您可以尝试这样做,即将结构分解为组件->组合 解组时使用Beta类型。它将仅解组Beta struct中定义的字段
switch val := intf.(type) {
我需要一些可以普遍使用的东西。我正在与许多面临这个问题的类型合作@NiranjanShetty:我不知道有什么内置选项可以做到这一点。在回答中添加更多细节为什么你想从json导入一些东西,而不是将其翻译回json?你是指类似func MarshalJSON(out interface{},fieldsTobeIgnored..interface{}{}的东西,如果是的话,你能改进函数吗?@ChenA。我有一个object字段&和id字段,object已经有id了,所以我不想再发送它了!我需要一些可以普遍使用的东西。我正在与许多面临这个问题的类型合作@NiranjanShetty:我不知道有什么内置选项可以做到这一点。在回答中添加更多细节为什么你想从json导入一些东西,而不是将其翻译回json?你是指类似func MarshalJSON(out interface{},fieldsTobeIgnored..interface{}{}的东西,如果是的话,你能改进函数吗?@ChenA。我有一个object字段&和id字段,object已经有id了,所以我不想再发送它了!我将使用反射和自定义封送处理函数。添加了一个答案。我将使用反射和自定义封送处理函数。添加了一个答案。不幸的是,当您在编辑中发现时,要生成一个真正强大的函数,您最终将不得不重写大部分
json.Marshal:)不幸的是,当您在编辑中发现时,为了实现一个真正强大的函数,最终你将不得不重写大部分json.Marshal(是的,我知道这种做法,不确定我们在go/go gorm中是否这样做。此外,正如你所说,用300-500个结构来完成这个中期项目会很痛苦,我知道这种做法,不确定我们在go/gorm中是否这样做,正如你所说的,用300-500个结构完成这个中期项目是一件痛苦的事情