Il y a quelques questions sur le sujet mais aucune d'elles ne semble couvrir mon cas, j'en crée donc une nouvelle.
J'ai JSON comme le suivant:
{"foo":{ "bar": "1", "baz": "2" }, "more": "text"}
Existe-t-il un moyen d'annuler la valeur de la propriété de barre imbriquée et de l'affecter directement à une propriété de structure sans créer de structure imbriquée?
La solution que j'adopte en ce moment est la suivante:
type Foo struct {
More String `json:"more"`
Foo struct {
Bar string `json:"bar"`
Baz string `json:"baz"`
} `json:"foo"`
// FooBar string `json:"foo.bar"`
}
Ceci est une version simplifiée, veuillez ignorer la verbosité. Comme vous pouvez le voir, j'aimerais pouvoir analyser et attribuer la valeur à
// FooBar string `json:"foo.bar"`
J'ai vu des gens utiliser une carte, mais ce n'est pas mon cas. Je ne me soucie fondamentalement pas du contenu de foo
(qui est un gros objet), à l'exception de quelques éléments spécifiques.
Quelle est la bonne approche dans ce cas? Je ne cherche pas de hacks étranges, donc si c'est la voie à suivre, je suis d'accord avec ça.
Comme ce que Volker a mentionné, les structures imbriquées sont la voie à suivre. Mais si vous ne voulez vraiment pas de structures imbriquées, vous pouvez remplacer la fonction UnmarshalJSON.
https://play.golang.org/p/dqn5UdqFfJt
Veuillez ignorer le fait que je ne renvoie pas une erreur appropriée. J'ai laissé cela pour simplifier.
MISE À JOUR: Récupération correcte de la valeur "plus".
la source
Voici un exemple de la façon d'annuler les réponses JSON du serveur proxy sbserver de l'API Safebrowsing v4: https://play.golang.org/p/4rGB5da0Lt
la source
Oui. Avec gjson, tout ce que vous avez à faire maintenant est:
bar := gjson.Get(json, "foo.bar")
bar
pourrait être une propriété struct si vous le souhaitez. De plus, pas de cartes.la source
fastjson.GetString(json, "foo", "bar")
Qu'en est-il des champs anonymes? Je ne sais pas si cela constituera une "structure imbriquée" mais c'est plus propre que d'avoir une déclaration de structure imbriquée. Que faire si vous souhaitez réutiliser l'élément imbriqué ailleurs?
la source
Attribuez les valeurs de nested
json
à struct jusqu'à ce que vous connaissiez le type sous-jacent des clés json: -la source
Je travaillais sur quelque chose comme ça. Mais ne fonctionne qu'avec des structures générées à partir de proto. https://github.com/flowup-labs/grpc-utils
dans ton proto
Alors votre sortie sera
la source
La combinaison de map et de struct permet de démarshaling des objets JSON imbriqués où la clé est dynamique. => carte [chaîne]
Par exemple: stock.json
Aller application
La clé dynamique dans le hachage gère une chaîne et l'objet imbriqué est représenté par une structure.
la source