>백엔드 개발 >Golang >Go에서 익명 멤버가 포함된 JSON 구조체를 어떻게 평면화할 수 있나요?

Go에서 익명 멤버가 포함된 JSON 구조체를 어떻게 평면화할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-28 05:20:30340검색

How Can I Flatten JSON Structs with Anonymous Members in Go?

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

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