3

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"}]}

1 Answer 1

2

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

Sign up to request clarification or add additional context in comments.

Comments

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.