JSON データを扱うとき、ネストされた構造がよく発生します。この階層構造により明確さが得られる一方で、特定のデータに効率的にアクセスすることが困難になる場合もあります。このプロセスを簡素化するには、ネストされた JSON 応答を平坦化すると効果的です。
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 サイトの他の関連記事を参照してください。