Go에서 익명 멤버를 사용하여 마샬링된 JSON 구조체 평면화
다음 코드에서
<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>
목표는 다음과 같습니다. 익명 멤버가 평면화되는 방식으로 JSON을 마샬링합니다. 기본적으로 익명 멤버는 JSON 출력에서 별도의 명명된 필드로 처리됩니다.
이에 대한 해결책은 Reflect 패키지를 사용하여 직렬화하려는 구조체의 필드를 맵[ 문자열]인터페이스{}. 이런 방식으로 새 필드를 도입하지 않고도 원래 구조체의 평면 구조를 유지할 수 있습니다.
이를 수행하는 코드는 다음과 같습니다.
<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>
이 코드는 구조체의 필드를 반복합니다. , 해당 값을 검색하고 필드의 JSON 태그를 키로 사용하여 출력 맵에 추가합니다. 이 프로세스를 통해 익명 구성원의 필드가 출력 맵으로 평면화됩니다.
이러한 방식으로 JSON 마샬링 프로세스를 사용자 정의하면 인터페이스에서 제공하는 유연성과 유형 안전성을 유지하면서 원하는 JSON 출력을 얻을 수 있습니다.
위 내용은 익명 멤버를 사용하여 Go에서 마샬링된 JSON 구조체를 평면화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!