亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將嵌套結構編組為平面 JSON

如何將嵌套結構編組為平面 JSON

Go
ABOUTYOU 2022-07-18 16:41:35
我正在嘗試將具有多個相同結構的嵌套結構編組為平面 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)

}

根據您期望此代碼隨時間增長/擴展的方式,您可能能夠使用某種循環或反射,但在不知道擴展計劃的情況下,不可能具體。


查看完整回答
反對 回復 2022-07-18
  • 1 回答
  • 0 關注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號