Go에서 JSON 데이터를 마샬링할 때 익명 멤버는 예상치 못한 복잡성을 초래할 수 있습니다. 이 기사에서는 이러한 과제를 해결하는 솔루션을 자세히 설명합니다.
다음 코드를 고려하세요.
<code class="go">type Hateoas struct { Anything Links map[string]string `json:"_links"` }</code>
Hateoas에 익명 구성원이 포함된 경우 JSON 마샬러가 이를 처리합니다. 일반 명명된 필드로 사용하면 원하지 않는 중첩이 발생합니다.
<code class="json">{ "Anything": { "id": 123, "name": "James Dean" }, "_links": { "self": "http://user/123" } }</code>
JSON 구조를 평면화하고 추가 중첩을 제거하려면 반사를 활용할 수 있습니다.
<code class="go">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 태그 이름을 추출하고 이를 평면화된 map[string]인터페이스{}에 매핑합니다. 리플렉션을 사용하면 새로운 명명된 필드를 추가하지 않고 원래의 평면 구조를 유지할 수 있습니다.
다음은 이 솔루션을 사용하는 방법에 대한 예입니다.
<code class="go">import "reflect" 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>
이 향상된 MarshalHateoas 기능을 사용하면 샘플 JSON 출력은 다음과 같습니다.
<code class="json">{ "id": 123, "name": "James Dean", "_links": { "self": "http://user/123" } }</code>
리플렉션을 활용하면 익명 멤버가 포함된 JSON 구조체를 효과적으로 평면화하고 데이터 무결성을 손상시키지 않고 원하는 JSON 구조를 달성할 수 있습니다. . 이 솔루션은 Go에서 복잡한 JSON 직렬화 시나리오를 처리하는 강력한 방법을 제공합니다.
위 내용은 Go에서 익명 멤버를 사용하여 마샬링된 JSON 구조체를 평면화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!