Apabila membangunkan aplikasi web menggunakan bahasa Go, ia selalunya melibatkan penyirian data ke dalam format JSON. Untuk bersiri pemetaan nilai kunci yang diisih, kita boleh menggunakan rangka kerja Gin dan struktur data peta di Golang untuk mencapainya. Dalam artikel ini, editor PHP Banana akan memperkenalkan anda secara terperinci cara membuat peta nilai kunci diisih yang boleh disirikan ke dalam JSON oleh Gin, menjadikan aplikasi web anda lebih fleksibel dan cekap. Mari kita lihat kaedah pelaksanaan khusus!
Saya menggunakan Gin untuk mencipta API REST. Respons yang saya cuba buat ialah peta json nilai utama seperti:
"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" },
Model data yang saya gunakan ialah:
type TopicBundle struct { ... Content map[string]Topic `json:"content"` }
dan ia bersiri dengan betul ke json:
c.JSON(200, topicBundle)
Hampir.
peta[rentetan]Topik tidak pernah mendapat nilainya dalam susunan yang betul. Saya menciptanya daripada peta yang diisih. Tetapi ini tidak membantu.
var contentMap = make(map[string]Topic, sm.Len()) for _, key := range sm.Keys() { contentMap[key.(string)] = first(sm.Get(key)).(Topic) }
Pada satu ketika peta ini nampaknya telah dicipta semula dan susunan kekunci sedikit berubah. Saya tidak dapat memikirkan sebarang alternatif lain, kerana Gin nampaknya hanya menyusun peta nilai kunci mentah ini dengan betul. Peta yang diisih daripada github.com/umpc/go-sortedmap tidak bersiri sama sekali.
Jadi, bagaimanakah cara saya mengekalkan susunan kunci dalam struktur asal (asli?) ini? Atau patutkah saya menulis penyeri bersiri tersuai untuk Gin?
Saya cuba mencari penyelesaian di internet.
Penyelesaian saya adalah dengan menulis pembungkus di sekeliling sortedmap.SortedMap dan menulis MarshalJSON tersuai untuk pembungkus ini:
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) }
Sila ambil perhatian bahawa takrifan MarshalJSON harus menggunakan SortedMapWrapper (bukannya *SortedMapWrapper). Jika tidak, ia tidak boleh ditemui.
Atas ialah kandungan terperinci Bagaimana untuk mencipta peta nilai kunci yang diisih yang boleh disiri ke json oleh Gin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!