Quelle est la bonne façon de convertir au format json.RawMessage sur une struct?
J'ai cette struct
type SyncInfo struct {
Target string
}
Maintenant j'ai une requête certaines json
des données à partir d'ElasticSearch. Source
est de type json.RawMessage
.
Tout ce que je veux, c'est la carte source
à mon SyncInfo
qui j'ai créé la variable mySyncInfo
.
J'ai même trouvé comment faire ça...mais ça fait bizarre. J'ai d'abord appel MarshalJSON()
pour obtenir un []byte
et puis les nourrir que de json.Unmarshal()
qui prend un []byte
et un pointeur vers mon struct.
Cela fonctionne bien, mais il se sent comme si je suis en train de faire un tronçon supplémentaire. Ai-je raté quelque chose ou est-ce la manière prévue à l'obtenir à partir d'une json.RawMessage
à un struct
?
var mySyncInfo SyncInfo
jsonStr, _ := out.Hits.Hits[0].Source.MarshalJSON()
json.Unmarshal(jsonStr, &mySyncInfo)
fmt.Print(mySyncInfo.Target)
OriginalL'auteur Christoph | 2014-04-23
Vous devez vous connecter pour publier un commentaire.
Comme l'a dit, le type sous-jacent de
json.RawMessage
est[]byte
, de sorte que vous peut utiliser unjson.RawMessage
que le paramètre de données àjson.Unmarshal
.Cependant, votre problème est que vous avez un pointeur (
*json.RawMessage
), et non une valeur. Tout ce que vous avez à faire est de déréférencement:De travail exemple:
De sortie:
Aire de jeux: http://play.golang.org/p/J8R3Qrjrzx
Bienvenue 🙂 Et happy Go de codage!
Vous n'avez pas vraiment besoin pour obtenir l'adresse d'une variable seulement déréférencer les 2 lignes ci-dessous. play.golang.org/p/75kvRlREPl- ou encore plus court: play.golang.org/p/kXMJchXM1CK
OriginalL'auteur ANisus
json.RawMessage
est vraiment juste une tranche d'octets. Vous devriez être en mesure de l'alimenter directement enjson.Unmarshal
directement, comme suit:Aussi, un peu non, mais
json.Unmarshal
peut retourner une erreur et que vous souhaitez gérer.cannot use hit.Source (type *json.RawMessage) as type []byte in function argument
Ah, nous avons besoin de faire référence à la valeur directement ensuite. Essayer de passer *json.RawMessage au lieu de json.RawMessage. J'ai mis à jour l'exemple de la réponse à tenir compte de ce changement.
OriginalL'auteur Zach Latta