Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何跳过json.Marshal&;的字段;不适用于json.Unmarshal中的go?_Json_Go_Go Gorm_Golang Migrate_Google App Engine Golang - Fatal编程技术网

如何跳过json.Marshal&;的字段;不适用于json.Unmarshal中的go?

如何跳过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

当我执行json.Marshal时,是否可以忽略SkipWhenMarshal字段,但当我执行json.Marshal时,是否可以忽略该字段 json.Unmarshal。 它应该适用于任何调用MarshalJSON

字段标记修饰符(如“省略空”和“-”)的类型,这些修饰符同时应用于封送和解封,因此没有自动方式

您可以为您的类型实现一个
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个结构完成这个中期项目是一件痛苦的事情