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

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

Susan Sarandon
Susan Sarandon원래의
2024-11-02 18:21:30414검색

How to flatten Marshalled JSON Structs in Go with anonymous members?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.