Meratakan Struktur Tanpa Nama Terbenam dalam JSON dengan Go
Dalam kod yang disediakan, fungsi MarshalHateoas cuba meratakan perwakilan JSON bagi struct oleh membenamkan struct tanpa nama sebagai ahli struct Hateoas. Walau bagaimanapun, medan ahli tanpa nama dianggap sebagai medan bernama berasingan, membawa kepada output JSON yang tidak diingini.
Untuk menyelesaikan isu ini, pakej reflect boleh dimanfaatkan untuk menggelungkan medan struct terbenam dan memetakannya secara manual kepada perwakilan yang diratakan. Berikut ialah versi MarshalHateoas yang diubah suai:
<code class="go">import ( "encoding/json" "fmt" "reflect" ) // ... func MarshalHateoas(subject interface{}) ([]byte, error) { links := make(map[string]string) // Retrieve the unexported fields of the subject struct subjectValue := reflect.Indirect(reflect.ValueOf(subject)) subjectType := subjectValue.Type() // Iterate over the fields of the embedded anonymous struct for i := 0; i < subjectType.NumField(); i++ { field := subjectType.Field(i) name := subjectType.Field(i).Name jsonFieldName := field.Tag.Get("json") // Exclude fields with "-" JSON tag if jsonFieldName == "-" { continue } // Add field values to the flattened map links[jsonFieldName] = subjectValue.FieldByName(name).Interface().(string) } // Return the JSON-encoded map return json.MarshalIndent(links, "", " ") }</code>
Dengan menggantikan ahli tanpa nama dengan peta yang dibina secara dinamik, fungsi MarshalHateoas kini meratakan output JSON dengan betul:
<code class="json">{ "id": 123, "name": "James Dean", "_links": { "self": "http://user/123" } }</code>
Penyelesaian ini membolehkan penciptaan perwakilan JSON yang diratakan daripada struct dengan ahli tanpa nama terbenam tanpa memperkenalkan medan baharu atau bergantung pada helah khusus platform atau bergantung kepada perpustakaan.
Atas ialah kandungan terperinci Bagaimana untuk Meratakan Struktur Tanpa Nama Terbenam dalam JSON dengan Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!