-2

我不知道怎么问,所以我举个例子问。

我有一些这样的数据

{
..
    "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"}
    },
    .
    .
    .

    }
..
}

我想声明一个类型,它将映射键作为它的“KEY”或我给定的任何属性。是否可以不使用地图迭代?

预期输出:

{...
   "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"`
    ..
}

但它不起作用。我想将该字符串映射键带到 KEY 属性。

4

1 回答 1

2

如果数据来自 JSON,那么您应该跳过map[string]interface{}并使用由您想要的结构实现的自定义解组器来执行您想要的操作。也许通过利用map[string]json.RawMessage. 但是map[string]interface{}结构转换很痛苦,如果可能的话,避免它。

例如:

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

于 2022-01-07T13:41:56.687 回答