I have some JSON that looks like this:
{
"ABC": {"symbol": "abc", "open": 42},
"DEF": {"symbol": "abc", "open": 42},
"GHI": {"symbol": "abc", "open": 42}
}
And I don't need the ABC/DEF/GHI part, only the part on the right. The values of ABC, DEF, and GHI are of type entity.Day
in my code, which looks something like this:
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"`
}
There are other endpoints that produce entity.Day
s, however this is the only one that's structured like this. How can I unmarshal the JSON into, ideally, an array of entity.Day
s?
My first thought was to make an intermediate data structure:
type previous struct {
tckrs map[string]entity.Day
}
p := previous{tckrs: make(map[string]entity.Day)}
json.Unmarshal(res, &p)
That code produces an empty struct and json.Unmarshal
returns a nil error. Can you help me?
PS - I searched around quite a bit and I found similar answers and lots of other people trying the map
approach, although that did not work for me.
The type previous
you defined would require your JSON to represent an object with one top level field containing the map.
Since your JSON models a map directly, you can use a map
to unmarshal it.
Try just:
p := make(map[string]Day)
json.Unmarshal(res, &p)