2016-10-22 45 views
3

我有一個結構Base如何動態地在JSON中包含/排除結構體的字段?

type Base struct { 
     Name string `json:"name,omitempty"` 
     // ... other fields 
} 

,另外兩個結構的,嵌入Base

type First struct { 
     Base 
     // ... other fields 
} 

type Second struct { 
     Base 
     // ... other fields 
} 

現在我要當元帥的結構FirstSecond但有一點差別。我想在First中包含Name字段,但我不想將其包含在Second中。

或者爲了簡化問題,我想動態地在JSON中輸入和輸出struct的字段。

注意: Name總是有價值,我不想改變它。

回答

-1

嘗試這樣:

type Base struct { 
    Name string `json: "name,omitempty"` 
    // ... other fields 
} 

type First struct { 
    Base 
    // ... other fields 
} 

type Second struct { 
    Base 
    Name string `json: "-"` 
    // ... other fields 
} 

這意味着你必須不再調用Second.Base.Name代碼只是Second.Name。

+0

不,它沒有工作!它仍然存在! 即使它可以工作,它似乎有點令我困惑!它可能會引起一些問題! – mehdy

2

您可以實現類型爲SecondMarshaler接口,並創建一個虛擬類型SecondClone

type SecondClone Second 

func (str Second) MarshalJSON() (byt []byte, err error) { 

    var temp SecondClone 
    temp = SecondClone(str) 
    temp.Base.Name = "" 
    return json.Marshal(temp) 
} 

這將無法對您的代碼進行其他更改。

它不會修改Name中的值,因爲它在不同的類型/副本上工作。

+0

它是有道理的,但我不想改變價值!有可能只是忽略'MarshalJSON'函數中的字段? – mehdy

+1

@mehdy這是最乾淨的解決方案。一旦你將Name屬性設置爲空,json.Marshal將不會解析,並且你將無法使用解串器 – Tinwor

+0

重新獲得它。也許可以在Marshal()之前保存值? 'foo:= str.Base.Name; str.Base.Name =「」;結果:= json.Marshal(str); str.Base.Name = foo;返回結果' – tobiash

相關問題