ホームページ >バックエンド開発 >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 関数を実装することが 1 つのアプローチです。 。この関数を使用すると、アンマーシャリング プロセスを処理し、それに応じてデータを変換できます。

提供された 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 をフラット化するには

<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) を使用して、最初にデータをアンマーシャルします。次に、フラット化された値を目的の Social 構造体に抽出してから返します。

ユーティリティ関数の使用 (推奨)

別のアプローチは、回答で提供されている 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。