如何在对象具有字符串键的Golang中解组JSON

时间:2018-07-12 03:17:12

标签: json go unmarshalling

我有一些看起来像这样的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.Day,但这是唯一这样构造的端点。理想情况下,如何才能将JSON解组到entity.Day s数组中?

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

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方法,尽管这对我不起作用。

1 个答案:

答案 0 :(得分:3)

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

由于您的JSON直接为地图建模,因此您可以使用map将其解组。

尝试:

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