Dynamically Create Structs in Golang

Issue

So I am working with an external API, whose responses I wanted to parse. The incoming responses are of a fixed format i.e.

type APIResponse struct {
    Items          []interface{} `json:"items"`
    QuotaMax       int           `json:"quota_max"`
    QuotaRemaining int           `json:"quota_remaining"`
}

So for each response I am parsing the items. Now the items can be of diff types as per the request. It can be a slice of sites, articles, etc. Which have their individual models. like:

type ArticleInfo struct {
    ArticleId    uint64   `json:"article_id"`
    ArticleType  string   `json:"article_type"`
    Link         string   `json:"link"`
    Title        string   `json:"title"`
}

type SiteInfo struct {
    Name    string `json:"name"`
    Slug    string `json:"slug"`
    SiteURL string `json:"site_url"`
}

Is there any way, when parsing the input define the type of Items in APIResponse. I don’t want to create separate types for individual responses.
Basically want to Unmarshall any incoming response into the APIResponse struct.

Solution

Change type of the Items field to interface{}:

type APIResponse struct {
    Items          interface{} `json:"items"`
    ...
}

Set the response Items field to pointer of the desired type. Unmarshal to the response:

var articles []ArticleInfo
response := APIResponse{Items: &articles}
err := json.Unmarshal(data, &response)

Access the articles using variable articles.

Run an example on the playground.

Answered By – Bayta Darell

Answer Checked By – Candace Johnson (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.