Heim >Backend-Entwicklung >Golang >Wie erstelle ich eine sortierte Schlüssel-Wert-Karte, die von Gin in JSON serialisiert werden kann?
Bei der Entwicklung von Webanwendungen mit der Go-Sprache geht es häufig darum, Daten in das JSON-Format zu serialisieren. Für die Serialisierung der sortierten Schlüsselwertzuordnung können wir das Gin-Framework und die Kartendatenstruktur in Golang verwenden, um dies zu erreichen. In diesem Artikel stellt Ihnen der PHP-Editor Banana ausführlich vor, wie Sie eine sortierte Schlüssel-Wert-Karte erstellen, die von Gin in JSON serialisiert werden kann, wodurch Ihre Webanwendung flexibler und effizienter wird. Werfen wir einen Blick auf die konkrete Implementierungsmethode!
Ich verwende Gin, um eine REST-API zu erstellen. Die Antwort, die ich zu erstellen versuche, ist eine Schlüsselwert-JSON-Karte wie:
"content": { "1.4.5.": { "id": "1.4.5.", "content": "some content", "title": "title" }, "1.4.6.": { "id": "1.4.6.", "content": "another content", "title": "another title" },
Das Datenmodell, das ich verwende, ist:
type TopicBundle struct { ... Content map[string]Topic `json:"content"` }
und es ist korrekt in JSON serialisiert:
c.JSON(200, topicBundle)
Fast.
map[string]Thema erhält seine Werte nie in der richtigen Reihenfolge. Ich erstelle es aus einer sortierten Karte. Aber das hilft nicht.
var contentMap = make(map[string]Topic, sm.Len()) for _, key := range sm.Keys() { contentMap[key.(string)] = first(sm.Get(key)).(Topic) }
Irgendwann scheint diese Karte neu erstellt und die Reihenfolge der Schlüssel leicht geändert worden zu sein. Mir fallen keine anderen Alternativen ein, da Gin diese rohe Schlüssel-Wert-Zuordnung anscheinend nur korrekt serialisiert. Die sortierte Karte von github.com/umpc/go-sortedmap ist überhaupt nicht serialisiert.
Wie behalte ich also die Reihenfolge der Schlüssel in dieser ursprünglichen (nativen?) Struktur bei? Oder sollte ich einen benutzerdefinierten Serialisierer für Gin schreiben?
Ich habe versucht, im Internet eine Lösung zu finden.
Meine Lösung bestand darin, einen Wrapper um sortedmap.SortedMap zu schreiben und einen benutzerdefinierten MarshalJSON für diesen Wrapper zu schreiben:
type TopicBundle struct { Content SortedMapWrapper `json:"content"` } type SortedMapWrapper struct { topics *sortedmap.SortedMap } func (wrapper SortedMapWrapper) MarshalJSON() ([]byte, error) { var sb strings.Builder var counter = 0 sb.WriteString("{") for _, key := range wrapper.topics.Keys() { sb.WriteString("\"") sb.WriteString(key.(string)) sb.WriteString("\":") sb.Write(first(json.Marshal(first(wrapper.topics.Get(key))))) counter += 1 if counter < wrapper.topics.Len() { sb.WriteString(",") } } sb.WriteString("}") return []byte(sb.String()), nil } func loadTopic(c *gin.Context) { var contentMap = sortedmap.New(1, comparisonFunc) contentMap.Insert("val1", Topic{"val1", "val2", "val3"}) contentMap.Insert("val33", Topic{"val1", "val2", "val3"}) var topicBundle = TopicBundle{} topicBundle.Content = SortedMapWrapper{contentMap} c.JSON(200, topicBundle) }
Bitte beachten Sie, dass die Definition von MarshalJSON SortedMapWrapper verwenden sollte (anstelle von *SortedMapWrapper). Sonst kann es nicht gefunden werden.
Das obige ist der detaillierte Inhalt vonWie erstelle ich eine sortierte Schlüssel-Wert-Karte, die von Gin in JSON serialisiert werden kann?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!