簡體   English   中英

如何將 map[string]interface{} 數據轉換為 struct

[英]how to convert map[string]interface{} data to struct

我不知道怎么問,所以我舉個例子問。

我有一些這樣的數據

{
..
    "velocityStatEntries":  {

    "8753":  {

        "estimated":  {"value":  23.0,"text":  "23.0"},

        "completed":  {"value":  27.0,"text":  "27.0"}
    },

    "8673":  {

        "estimated":  {"value":  54.5,"text":  "54.5"},

        "completed":  {"value":  58.5,"text":  "58.5"}
    },
    .
    .
    .

    }
..
}

我想聲明一個類型,它將 map 鍵作為其“KEY”或我給定的任何屬性。 是否可以不使用 map 迭代?

預期 output:

{...
   "velocityStatEntries": {
   {
     "key": "8753",
     "estimated":  {"value":  54.5,"text":  "54.5"},
     "completed":  {"value":  58.5,"text":  "58.5"}
   },
   {
     "key": "8673",
     "estimated":  {"value":  54.5,"text":  "54.5"},
     "completed":  {"value":  58.5,"text":  "58.5"}
   },
  }
...
}

這就是我所做的

type VelocityStatEntry struct {
    Key string
    Estimated struct {
        Value float64 `json:"value"`
        Text  string  `json:"text"`
    } `json:"estimated"`
    Completed struct {
        Value float64 `json:"value"`
        Text  string  `json:"text"`
    } `json:"completed"`
}

type RapidChartResponse struct {
    ...
    VelocityStatEntries map[string]VelocityStatEntry `json:"velocityStatEntries"`
    ..
}

但它不起作用。 我想將該字符串 map 鍵作為 KEY 屬性。

如果數據來自 JSON 那么您應該跳過map[string]interface{}而是使用由您想要的結構實現的自定義解組器來執行您想要的操作。 也許通過利用map[string]json.RawMessage 但是從map[string]interface{}到 struct 的轉換很痛苦,如果可能的話,避免它。

例如:

type VelocityStatEntryList []*VelocityStatEntry

func (ls *VelocityStatEntryList) UnmarshalJSON(data []byte) error {
    var m map[string]json.RawMessage
    if err := json.Unmarshal(data, &m); err != nil {
        return err
    }
    for k, v := range m {
        e := &VelocityStatEntry{Key: k}
        if err := json.Unmarshal([]byte(v), e); err != nil {
            return err
        }
        *ls = append(*ls, e)
    }
    return nil
}

https://go.dev/play/p/VcaW_BWXRVr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM