Go에서 익명 멤버를 사용하여 마샬링된 JSON 구조체 평면화
제공된 코드는 익명 멤버가 포함된 구조체를 사용자 정의 " _links' 필드. 그러나 익명 멤버 "Anything"이 명명된 필드로 처리되어 원하지 않는 JSON 구조가 발생합니다.
JSON 마샬링에서 익명 멤버 처리 이해
Go의 JSON 마샬러 익명 구조체 필드를 내보낸 내부 필드가 외부 구조체의 필드인 것처럼 처리합니다. 이 동작은 이름이 포함된 JSON 태그를 제공하여 재정의할 수 있지만 익명 구성원을 평면화하기 위한 명시적인 메커니즘은 없습니다.
Reflection을 사용한 솔루션
원하는 결과를 얻으려면 병합을 위해 아래 솔루션은 Reflect 패키지를 활용합니다. 구조체의 필드를 반복함으로써 새 필드를 도입하지 않고도 원래 객체의 구조를 유지하는 map[string]인터페이스{}를 생성할 수 있습니다.
<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() } ... }</code>
사용 예
다음 예에서는 사용자 및 세션 구조체에 대한 평면화된 JSON 출력을 보여줍니다.
<code class="go">package main import ( "encoding/json" "fmt" "reflect" ) type User struct { Id int `json:"id"` Name string `json:"name"` } type Session struct { Id int `json:"id"` UserId int `json:"userId"` } func MarshalHateoas(subject interface{}) ([]byte, error) { ... } func main() { u := &User{123, "James Dean"} s := &Session{456, 123} json, err := MarshalHateoas(u) if err != nil { panic(err) } else { fmt.Println("User JSON:") fmt.Println(string(json)) } json, err = MarshalHateoas(s) if err != nil { panic(err) } else { fmt.Println("Session JSON:") fmt.Println(string(json)) } }</code>
JSON 출력:
User JSON: { "id": 123, "name": "James Dean", "_links": { "self": "http://user/123" } } Session JSON: { "id": 456, "userId": 123, "_links": { "self": "http://session/456" } }
위 내용은 Go에서 익명 멤버가 포함된 JSON 구조체를 어떻게 평면화할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!