2015-05-09 3 views
1

Когда я пытаюсь Marshal карты, json.Marshal возвращения:json.Marshal карта в JSON массив

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

Это нормальное поведение. Но я могу маршалу это:

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

ответ

1

Вы можете определить пользовательский интерфейс json.Marshaler, чтобы сделать это, например:

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

Смежные вопросы