3

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.Days, however this is the only one that's structured like this. How can I unmarshal the JSON into, ideally, an array of entity.Days?

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.

1
  • json.Unmarshal(res,&p.tckrs)? Commented Jul 12, 2018 at 3:24

1 Answer 1

3

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)
Sign up to request clarification or add additional context in comments.

1 Comment

Wow, duh.. I was hoping this question could help some other people as well; I guess it will if they miss something obvious like I did. Thank you for being really nice about it!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.