我正在嘗試將具有多個(gè)相同結(jié)構(gòu)的嵌套結(jié)構(gòu)編組為平面 JSON 結(jié)構(gòu) EGtype A struct { Value float64 Unit string}type B struct { p1 string `json:p1` p2 int `json:p1` ... a1 A `json:"a1,omitempty"` a2 A `json:"a1,omitempty"` ...}調(diào)用時(shí)json.Marshall(B)的目標(biāo)是得到一個(gè)使用上述代碼打印平面結(jié)構(gòu)的 json 結(jié)構(gòu)。所以,而不是{ "p1": "...", "p2": 1, ... "a1": {...} "a2": {...} ...}我會(huì)得到一個(gè)類似于{ "p1": "...", "p2": 1, ... "a1": 1.1, "a1_u": "unit", "a2": 1.2, "a2_u": "unit", ...}我已經(jīng)研究過嵌入的概念,但這只有在 B 中只有一個(gè) A 時(shí)才有效。而且仍然不能完全實(shí)現(xiàn)我的愿望。遺憾的是,JSON 中需要這種結(jié)構(gòu)的原因是不可協(xié)商的。而且需要用到的結(jié)構(gòu)體會(huì)包含大量的A{}. 已知它們將包含什么,因此可以選擇創(chuàng)建和使用如下結(jié)構(gòu)。但隨著項(xiàng)目的發(fā)展,它只會(huì)讓人感到困惑并造成維護(hù)地獄。type C struct { p1 string `json:p1` p2 int `json:p1` ... a1 float64 `json:"a1,omitempty"` a1_u string `json:"a1_u,omitempty"` a2 float64 `json:"a2,omitempty"` a2_U string `json:"a2_u,omitempty"` ...}可以選擇編寫自定義編組B{},A{}這可能可以滿足我的需要,問題是我們需要一堆不同的結(jié)構(gòu),這些結(jié)構(gòu)B{}足夠相似,我相信應(yīng)該有一種方法來概括解決這個(gè)問題。思想去使用與反射有關(guān)的東西。但是由于我對(duì) GO 還很陌生,所以我還沒有設(shè)法找出解決方案。谷歌搜索所花費(fèi)的所有努力只會(huì)讓我看到相反的結(jié)果。提前感謝您的任何幫助,如果它是“無法完成”的事件。*編輯B并且通過擴(kuò)展C意味著能夠包含任意數(shù)量A以及一些原語。將來可能會(huì)有類型D,E并且每個(gè)類型都包含不常見的數(shù)量A和原語?;蛘邔?shí)際上是具有這些約束的任意數(shù)量的結(jié)構(gòu)。我要避免的是為每個(gè)新結(jié)構(gòu)編寫一個(gè) Marhaller。
1 回答
UYOU
TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
編寫一個(gè)自定義封送器。例子:
type A struct {
Value float64
Unit string
}
type B struct {
a1 A
a2 A
}
func (b *B) MarshalJSON() ([]byte, error) {
intermediate := map[string]interface{}{
"a1": b.a1.Value,
"a1_u": b.a1.Unit,
"a2": b.a2.Value,
"a2_u": b.a2.Unit,
}
return json.Marshal(intermediate)
}
根據(jù)您期望此代碼隨時(shí)間增長(zhǎng)/擴(kuò)展的方式,您可能能夠使用某種循環(huán)或反射,但在不知道擴(kuò)展計(jì)劃的情況下,不可能具體。
- 1 回答
- 0 關(guān)注
- 112 瀏覽
添加回答
舉報(bào)
0/150
提交
取消
