Maxim Lis
Maxim Lis

Reputation: 173

json.Marshal map to JSON array

When i try Marshal a map, json.Marshal return:

{"Map Key":"Map Value"}...

This is normal behavior. But i can marshal this to:

{"Map":[{"Name":"Map Key","Date":"Map Value"},{"Name":"Map Key2","Date":"Map Value2"}]}

Upvotes: 3

Views: 1901

Answers (1)

OneOfOne
OneOfOne

Reputation: 99234

You can define a custom json.Marshaler interface to do that, for example:

type mapInfo struct {
    Name string `json:"name"`
    Date string `json:"date"`
}

type CustomMap map[string]string

func (cm CustomMap) MarshalJSON() ([]byte, error) {
    // if you want to optimize you can use a bytes.Buffer and write the strings out yourself.
    var out struct {
        Map []mapInfo `json:"map"`
    }
    for k, v := range cm {
        out.Map = append(out.Map, mapInfo{k, v})
    }
    return json.Marshal(out)
}

func (cm CustomMap) UnmarshalJSON(b []byte) (err error) {
    var out struct {
        Map []mapInfo `json:"map"`
    }
    if err = json.Unmarshal(b, &out); err != nil {
        return
    }
    for _, v := range out.Map {
        cm[v.Name] = v.Date
    }
    return
}

playground

Upvotes: 2

Related Questions