Go에서 익명 멤버를 사용하여 마샬링된 JSON 구조체를 평면화하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-29 07:35:31
원래의
215명이 탐색했습니다.

How to Flatten Marshaled JSON Structs with Anonymous Members in Go?

Go에서 익명 멤버를 사용하여 마샬링된 JSON 구조체 평면화

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿