我正在嘗試將具有多個相同結構的嵌套結構編組為平面 JSON 結構 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"` ...}調用時json.Marshall(B)的目標是得到一個使用上述代碼打印平面結構的 json 結構。所以,而不是{ "p1": "...", "p2": 1, ... "a1": {...} "a2": {...} ...}我會得到一個類似于{ "p1": "...", "p2": 1, ... "a1": 1.1, "a1_u": "unit", "a2": 1.2, "a2_u": "unit", ...}我已經研究過嵌入的概念,但這只有在 B 中只有一個 A 時才有效。而且仍然不能完全實現我的愿望。遺憾的是,JSON 中需要這種結構的原因是不可協商的。而且需要用到的結構體會包含大量的A{}. 已知它們將包含什么,因此可以選擇創建和使用如下結構。但隨著項目的發展,它只會讓人感到困惑并造成維護地獄。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{}這可能可以滿足我的需要,問題是我們需要一堆不同的結構,這些結構B{}足夠相似,我相信應該有一種方法來概括解決這個問題。思想去使用與反射有關的東西。但是由于我對 GO 還很陌生,所以我還沒有設法找出解決方案。谷歌搜索所花費的所有努力只會讓我看到相反的結果。提前感謝您的任何幫助,如果它是“無法完成”的事件。*編輯B并且通過擴展C意味著能夠包含任意數量A以及一些原語。將來可能會有類型D,E并且每個類型都包含不常見的數量A和原語?;蛘邔嶋H上是具有這些約束的任意數量的結構。我要避免的是為每個新結構編寫一個 Marhaller。
1 回答

UYOU
TA貢獻1878條經驗 獲得超4個贊
編寫一個自定義封送器。例子:
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)
}
根據您期望此代碼隨時間增長/擴展的方式,您可能能夠使用某種循環或反射,但在不知道擴展計劃的情況下,不可能具體。
- 1 回答
- 0 關注
- 96 瀏覽
添加回答
舉報
0/150
提交
取消