Heim >Backend-Entwicklung >Golang >Wie erstelle ich eine sortierte Schlüssel-Wert-Karte, die von Gin in JSON serialisiert werden kann?

Wie erstelle ich eine sortierte Schlüssel-Wert-Karte, die von Gin in JSON serialisiert werden kann?

WBOY
WBOYnach vorne
2024-02-08 23:36:10795Durchsuche

如何创建一个可以由 Gin 序列化为 json 的排序键值映射?

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!

Frageninhalt

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.

Workaround

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen