>백엔드 개발 >Golang >Go에서 중첩된 JSON 응답을 어떻게 평면화할 수 있나요?

Go에서 중첩된 JSON 응답을 어떻게 평면화할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-10-27 16:22:29502검색

How Can We Flatten Nested JSON Responses in Go?

Go에서 중첩 JSON 응답 평면화

JSON 데이터로 작업할 때 중첩 구조를 접하는 것이 일반적입니다. 이러한 계층적 조직은 명확성을 제공할 수 있지만 특정 데이터에 효율적으로 액세스하는 것을 어렵게 만들 수도 있습니다. 이 프로세스를 단순화하려면 중첩된 JSON 응답을 평면화하는 것이 도움이 될 수 있습니다.

사용자 지정 UnmarshalJSON 구현

Go에서 중첩된 JSON 응답을 평면화하려면 원하는 구조체 유형에 대해 사용자 지정 UnmarshalJSON 함수를 구현하는 것이 좋습니다. . 이 함수를 사용하면 역마샬링 프로세스를 처리하고 이에 따라 데이터를 변환할 수 있습니다.

제공된 Go 코드에서 Social 구조체는 원하는 평면화된 형식을 나타냅니다.

<code class="go">type Social struct {
    GooglePlusPlusOnes uint32 `Social:"GooglePlusOne"`
    TwitterTweets uint32 `json:"Twitter"`
    LinkedinShares uint32 `json:"LinkedIn"`
    PinterestPins uint32 `json:"Pinterest"`
    StumbleuponStumbles uint32 `json:"StumbleUpon"`
    DeliciousBookmarks uint32 `json:"Delicious"`
    FacebookLikes uint32 `json:"??some_magical_nested_address??"`
    FacebookShares uint32 `json:"??some_magical_nested_address??"`
    FacebookComments uint32 `json:"??some_magical_nested_address??"`
    FacebookTotal uint32 `json:"??some_magical_nested_address??"`
}</code>

중첩된 Facebook을 평면화하려면 데이터의 경우 다음과 같이 UnmarshalJSON 함수를 구현할 수 있습니다.

<code class="go">func (s *Social) UnmarshalJSON(data []byte) error {
    type SocialTemp struct {
        GooglePlusPlusOnes  uint32 `json:"GooglePlusOne"`
        TwitterTweets       uint32 `json:"Twitter"`
        LinkedinShares      uint32 `json:"LinkedIn"`
        PinterestPins       uint32 `json:"Pinterest"`
        StumbleuponStumbles uint32 `json:"StumbleUpon"`
        DeliciousBookmarks  uint32 `json:"Delicious"`
        Facebook           struct {
            FacebookLikes    uint32 `json:"like_count"`
            FacebookShares   uint32 `json:"share_count"`
            FacebookComments uint32 `json:"comment_count"`
            FacebookTotal    uint32 `json:"total_count"`
        } `json:"Facebook"`
    }
    
    var temp SocialTemp
    if err := json.Unmarshal(data, &temp); err != nil {
        return err
    }
    
    *s = Social{
        GooglePlusPlusOnes:  temp.GooglePlusPlusOnes,
        TwitterTweets:       temp.TwitterTweets,
        LinkedinShares:      temp.LinkedinShares,
        PinterestPins:       temp.PinterestPins,
        StumbleuponStumbles: temp.StumbleuponStumbles,
        DeliciousBookmarks:  temp.DeliciousBookmarks,
        FacebookLikes:        temp.Facebook.FacebookLikes,
        FacebookShares:       temp.Facebook.FacebookShares,
        FacebookComments:    temp.Facebook.FacebookComments,
        FacebookTotal:       temp.Facebook.FacebookTotal,
    }
    return nil
}</code>

이 구현에서는 임시 구조체(SocialTemp)를 사용하여 처음에 데이터를 비정렬화합니다. 그런 다음 반환하기 전에 평면화된 값을 원하는 소셜 구조체로 추출합니다.

유용 함수 사용(권장)

대체 접근 방식은 답변에 제공된 Flatten과 같은 유틸리티 함수를 활용하는 것입니다.

<code class="go">func Flatten(m map[string]interface{}) map[string]interface{} {
    o := make(map[string]interface{})
    for k, v := range m {
            switch child := v.(type) {
            case map[string]interface{}:
                    nm := Flatten(child)
                    for nk, nv := range nm {
                            o[k+"."+nk] = nv
                    }
            default:
                    o[k] = v
            }
    }
    return o
}</code>

다음 유틸리티 함수를 적용할 수 있습니다.

<code class="go">var jsonBlob = []byte(`[
    {"StumbleUpon":0,"Reddit":0,"Facebook":{"commentsbox_count":4691,"click_count":0,"total_count":298686,"comment_count":38955,"like_count":82902,"share_count":176829},"Delicious":0,"GooglePlusOne":275234,"Buzz":0,"Twitter":7346788,"Diggs":0,"Pinterest":40982,"LinkedIn":0}
]`)
var flatJson = Flatten(json.Unmarshal(jsonBlob))</code>

이렇게 하면 원하는 데이터 구조가 포함된 평면화된 지도가 생성됩니다.

위 내용은 Go에서 중첩된 JSON 응답을 어떻게 평면화할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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