Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk meratakan Marshalled JSON Structs dalam Go dengan ahli tanpa nama?

Bagaimana untuk meratakan Marshalled JSON Structs dalam Go dengan ahli tanpa nama?

Susan Sarandon
Susan Sarandonasal
2024-11-02 18:21:30414semak imbas

How to flatten Marshalled JSON Structs in Go with anonymous members?

Meratakan Struktur JSON Marshalled dengan Ahli Tanpa Nama dalam Go

Dalam kod berikut:

<code class="go">type Anything interface{}

type Hateoas struct {
    Anything
    Links map[string]string `json:"_links"`
}

func MarshalHateoas(subject interface{}) ([]byte, error) {
    h := &Hateoas{subject, make(map[string]string)}
    switch s := subject.(type) {
    case *User:
        h.Links["self"] = fmt.Sprintf("http://user/%d", s.Id)
    case *Session:
        h.Links["self"] = fmt.Sprintf("http://session/%d", s.Id)
    }
    return json.MarshalIndent(h, "", "    ")
}</code>

matlamatnya ialah untuk marsyal JSON dengan cara ahli tanpa nama diratakan. Secara lalai, ahli tanpa nama dianggap sebagai medan bernama berasingan dalam output JSON.

Penyelesaian untuk perkara ini ialah menggunakan pakej reflect untuk memetakan medan struct secara manual yang ingin kami sirikan ke peta[ rentetan]antara muka{}. Dengan cara ini, kita boleh mengekalkan struktur rata bagi struct asal tanpa memperkenalkan medan baharu.

Berikut ialah kod yang menyelesaikannya:

<code class="go">func MarshalHateoas(subject interface{}) ([]byte, error) {
    links := make(map[string]string)
    out := make(map[string]interface{})
    subjectValue := reflect.Indirect(reflect.ValueOf(subject))
    subjectType := subjectValue.Type()
    for i := 0; i < subjectType.NumField(); i++ {
        field := subjectType.Field(i)
        name := subjectType.Field(i).Name
        out[field.Tag.Get("json")] = subjectValue.FieldByName(name).Interface()
    }
    switch s := subject.(type) {
    case *User:
        links["self"] = fmt.Sprintf("http://user/%d", s.Id)
    case *Session:
        links["self"] = fmt.Sprintf("http://session/%d", s.Id)
    }
    out["_links"] = links
    return json.MarshalIndent(out, "", "    ")
}</code>

Kod ini berulang ke atas medan struct , mendapatkan semula nilainya dan menambahkannya pada peta output menggunakan teg JSON medan sebagai kunci. Proses ini memastikan bahawa medan ahli tanpa nama diratakan ke dalam peta output.

Dengan menyesuaikan proses marshaling JSON dengan cara ini, kami boleh mencapai output JSON yang diingini sambil mengekalkan fleksibiliti dan keselamatan jenis yang disediakan oleh antara muka.

Atas ialah kandungan terperinci Bagaimana untuk meratakan Marshalled JSON Structs dalam Go dengan ahli tanpa nama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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