La manipulation Personnalisé BFILS Marshaling

J'ai un certain nombre de structures qui nécessitent personnalisé marshaling. Quand j'ai été le tester j'ai été en utilisant JSON et la norme JSON marshaller. Comme il n'est pas le maréchal désexporter champs, j'ai eu besoin d'écrire une coutume MarshalJSON fonction, ce qui a parfaitement fonctionné. Quand j'ai appelé json.Maréchal sur le parent structure contenant celles qui s'avèrent nécessaires personnalisé marshaling des champs, il a bien fonctionné.

Maintenant, j'ai besoin de maréchal tout à BFILS pour certains MongoDB travail, et je ne trouve pas de documentation sur la façon d'écrire personnalisé BFILS de triage. Quelqu'un peut-il me dire comment faire l'équivalent pour BFILS/mgo pour ce que j'ai démontré ci-dessous?

monnaie.aller (en partie)

type Currency struct {
    value        decimal.Decimal //The actual value of the currency.
    currencyCode string          //The ISO currency code.
}

/*
MarshalJSON implements json.Marshaller.
*/
func (c Currency) MarshalJSON() ([]byte, error) {
    f, _ := c.Value().Float64()
    return json.Marshal(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    }{
        Value:        f,
        CurrencyCode: c.CurrencyCode(),
    })
}

/*
UnmarshalJSON implements json.Unmarshaller.
*/
func (c *Currency) UnmarshalJSON(b []byte) error {

    decoded := new(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    })

    jsonErr := json.Unmarshal(b, decoded)

    if jsonErr == nil {
        c.value = decimal.NewFromFloat(decoded.Value)
        c.currencyCode = decoded.CurrencyCode
        return nil
    } else {
        return jsonErr
    }
}

produit.aller (encore une fois, juste les parties pertinentes)

type Product struct {
    Name  string
    Code  string
    Price currency.Currency
}

Quand je l'appelle json.Maréchal(p) où p est un Produit, il produit de la sortie que je veux, sans la nécessité pour le modèle (pas sûr du nom) où vous créez une structure qui est juste un clone avec tous les champs à exporter.

À mon avis, à l'aide de la ligne de la méthode que j'ai utilisé simplifie grandement l'API, et vous empêche d'avoir des structures qui encombrent les choses.

  • Je suppose que le fait que la Monnaie struct est déclarée à l'aide de désexporter champs est une faute de frappe ?
  • Nope, c'est délibéré. Il n'y a plus de code que ci-dessus et je suis un grand partisan de l'utilisation des getters/setters pour arrêter le programmeur de modifier ce qu'ils veulent, sans égard pour la immuables de la logique métier, plus la couche d'abstraction désigne tout changer plus tard en bas de la ligne pour le fonctionnement interne de mon struct signifie que je dois changer un minimum de code.
  • Et aussi, si vous êtes un utilisateur de la shopspring/decimal paquet, les champs ne sont pas exportés, donc dans les deux cas, vous auriez encore à définir une coutume Getter/Setter pour activer la sérialisation/deserialisation comme indiqué dans la réponse.
InformationsquelleAutor leylandski | 2015-06-17