Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk mencipta peta nilai kunci yang diisih yang boleh disiri ke json oleh Gin?

Bagaimana untuk mencipta peta nilai kunci yang diisih yang boleh disiri ke json oleh Gin?

WBOY
Lepaskan: 2024-02-08 23:36:10
ke hadapan
785 orang telah melayarinya

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

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!

Kandungan soalan

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"
        },
Salin selepas log masuk

Model data yang saya gunakan ialah:

type TopicBundle struct {
  ...
  Content      map[string]Topic `json:"content"`
}
Salin selepas log masuk

dan ia bersiri dengan betul ke json:

c.JSON(200, topicBundle)
Salin selepas log masuk

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)
    }
Salin selepas log masuk

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

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)
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan