如何将map[string]接口{}数据转换为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";或我提供的任何财产。不使用地图迭代是否可能?

预期输出:

{...
"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属性。

如果数据源于JSON,那么您应该跳过map[string]interface{},而是使用由您想要的结构实现的自定义解组器。也许通过使用CCD_ 2。但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

相关内容

  • 没有找到相关文章

最新更新