首页 > 解决方案 > 如何在对象具有字符串键的 Golang 中解组 JSON

问题描述

我有一些看起来像这样的 JSON:

{
  "ABC": {"symbol": "abc", "open": 42},
  "DEF": {"symbol": "abc", "open": 42},
  "GHI": {"symbol": "abc", "open": 42}
}

我不需要 ABC/DEF/GHI 部分,只需要右边的部分。ABC、DEF 和 GHI 的值是entity.Day我的代码中的类型,如下所示:

type Day struct {
    Symbol           string    `json:"symbol"  sql:"symbol"`
    Date             time.Time `json:"date"  sql:"date"`
    OpenP            float64   `json:"open"  sql:"open"`
    HighP            float64   `json:"high"  sql:"high"`
    LowP             float64   `json:"low"  sql:"low"`
    CloseP           float64   `json:"close"  sql:"close"`
    VolumeP          float64   `json:"volume"  sql:"volume"`
    Label            string    `json:"label" sql:"-"`
    ChangeOverTime   float64   `json:"changeOverTime"  sql:"change_over_time"`
    UnadjustedVolume float64   `json:"unadjustedVolume"  sql:"unadjusted_volume"`
    Change           float64   `json:"change"  sql:"change"`
    ChangePercent    float64   `json:"changePercent"  sql:"change_percent"`
    VWAP             float64   `json:"vwap"  sql:"vwap"`
}

还有其他产生entity.Days 的端点,但这是唯一一个具有这种结构的端点。理想情况下,如何将 JSON 解组为entity.Days 数组?

我的第一个想法是做一个中间数据结构:

type previous struct {
    tckrs map[string]entity.Day
}

p := previous{tckrs: make(map[string]entity.Day)}
json.Unmarshal(res, &p)

该代码产生一个空结构并json.Unmarshal返回一个 nil 错误。你能帮助我吗?

PS - 我搜索了很多,我发现了类似的答案,还有很多其他人尝试了这种map方法,尽管这对我不起作用。

标签: jsongounmarshalling

解决方案


您定义的类型previous将要求您的 JSON 表示一个具有包含地图的顶级字段的对象。

由于您的 JSON 直接对地图进行建模,因此您可以使用 amap来解组它。

试试:

p := make(map[string]Day)
json.Unmarshal(res, &p)

推荐阅读