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!