Maison >développement back-end >Golang >Comment puis-je aplatir les données JSON imbriquées dans une structure à un seul niveau à l'aide des fonctions UnmarshalJSON personnalisées dans Go ?

Comment puis-je aplatir les données JSON imbriquées dans une structure à un seul niveau à l'aide des fonctions UnmarshalJSON personnalisées dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-28 14:49:02383parcourir

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

Aplatissement du JSON imbriqué

L'aplatissement des données JSON imbriquées dans une structure à un seul niveau est une tâche courante dans le traitement des données. Voici comment y parvenir dans Go à l'aide d'une fonction UnmarshalJSON personnalisée :

Fonction UnmarshalJSON

Les fonctions UnmarshalJSON personnalisées permettent aux structures Go de gérer la désorganisation des données JSON. Voici votre structure sociale mise à jour avec l'implémentation UnmarshalJSON :

<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>

Utilisation

Avec la structure sociale mise à jour, vous pouvez désormais désorganiser votre document JSON et l'aplatir :

<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>

Ce code affichera la structure JSON aplatie souhaitée, avec les champs Facebook fusionnés dans la structure sociale de niveau supérieur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn