package main import ( "encoding/json" "io" "strings" ) type charInfo struct { Nicks []string `json:"nicks"` Name string `json:"name"` Author string `json:"player"` ShortName string `json:"first"` } func load(reader io.Reader) ([]charInfo, error) { data := make(map[string]interface{}) err := json.NewDecoder(reader).Decode(&data) if err != nil { return nil, err } links := make(map[string]string, len(data)) infos := make([]charInfo, 0, 64) for key, value := range data { if info, ok := value.(map[string]interface{}); ok { name := info["name"].(string) author := info["player"].(string) shortName, ok := info["first"].(string) if !ok { shortName = strings.SplitN(name, " ", 2)[0] } infos = append(infos, charInfo{ Nicks: []string{key}, Name: name, Author: author, ShortName: shortName, }) } else if nick, ok := value.(string); ok { links[key] = nick } } for key, value := range links { for i := range infos { if infos[i].Nicks[0] == value { infos[i].Nicks = append(infos[i].Nicks, key) } } } return infos, nil }