ホームページ  >  記事  >  バックエンド開発  >  Go のカスタム UnmarshalJSON 関数を使用して、ネストされた JSON データを単一レベルの構造にフラット化するにはどうすればよいですか?

Go のカスタム UnmarshalJSON 関数を使用して、ネストされた JSON データを単一レベルの構造にフラット化するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-28 14:49:02288ブラウズ

How can I flatten nested JSON data into a single level structure using custom UnmarshalJSON functions in Go?

ネストされた JSON のフラット化

ネストされた JSON データを単一レベルの構造にフラット化することは、データ処理における一般的なタスクです。カスタム UnmarshalJSON 関数を使用して Go でこれを実現する方法は次のとおりです。

UnmarshalJSON 関数

カスタム UnmarshalJSON 関数を使用すると、Go 構造体で JSON データのアンマーシャリングを処理できます。 UnmarshalJSON 実装を使用した更新された 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"`

    // Custom unmarshalling for the Facebook fields
    FacebookLikes       uint32 `json:"-"`
    FacebookShares      uint32 `json:"-"`
    FacebookComments    uint32 `json:"-"`
    FacebookTotal       uint32 `json:"-"`
}

// UnmarshalJSON implements the Unmarshaler interface for custom JSON unmarshalling
func (s *Social) UnmarshalJSON(data []byte) error {
    type FacebookAlias Facebook
    aux := &struct {
        Facebook FacebookAlias `json:"Facebook"`
    }{}

    if err := json.Unmarshal(data, aux); err != nil {
        return err
    }

    s.FacebookLikes = aux.Facebook.FacebookLikes
    s.FacebookShares = aux.Facebook.FacebookShares
    s.FacebookComments = aux.Facebook.FacebookComments
    s.FacebookTotal = aux.Facebook.FacebookTotal
    return nil
}</code>

使用法

更新された Social 構造体を使用すると、JSON ドキュメントをアンマーシャリングしてフラット化できるようになりました:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Social struct {
    // ... (same as before)
}

func (s *Social) UnmarshalJSON(data []byte) error { // ... (same as before) }

func main() {
    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 social []Social
    err := json.Unmarshal(jsonBlob, &social)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%+v", social)
}</code>

このコードは、Facebook フィールドが最上位の Social 構造体にマージされた、目的のフラット化された JSON 構造を出力します。

以上がGo のカスタム UnmarshalJSON 関数を使用して、ネストされた JSON データを単一レベルの構造にフラット化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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