web-dev-qa-db-fra.com

Conversion de chaîne en json ou struct

Je veux obtenir une chaîne qui représente un JSON comme celui-ci:

{"votes": {"option_A": "3"}}

et y inclure une clé "count" donc ça finit comme ça:

{"votes": {"option_A": "3"}, "compte": "1"}

C'est pourquoi j'ai prévu de le convertir en json afin de pouvoir ajouter le nombre, puis de le transformer à nouveau en chaîne. Le problème est que je ne connais pas la structure de ce json, je ne peux donc pas utiliser json.Unmarshal(in, &myStruct) car cette structure varie. Comment puis-je faire ceci? Merci beaucoup

31
Leticia Esperon

Vous n'avez vraiment besoin que d'une seule structure et, comme indiqué dans les commentaires, les annotations correctes sur le champ donneront les résultats souhaités. JSON n’est pas un format de données extrêmement variable, il est bien défini et tout élément de JSON, aussi compliqué soit-il déroutant, peut être représenté assez facilement et avec une précision de 100%, à la fois par un schéma et par des objets dans Go and la plupart des autres OO langages de programmation. Voici un exemple.

package main

import (
    "fmt"
    "encoding/json"
)

type Data struct {
    Votes *Votes `json:"votes"`
    Count string `json:"count,omitempty"`
}

type Votes struct {
    OptionA string `json:"option_A"`
}

func main() {
    s := `{ "votes": { "option_A": "3" } }`
    data := &Data{
        Votes: &Votes{},
    }
    err := json.Unmarshal([]byte(s), data)
    fmt.Println(err)
    fmt.Println(data.Votes)
    s2, _ := json.Marshal(data)
    fmt.Println(string(s2))
    data.Count = "2"
    s3, _ := json.Marshal(data)
    fmt.Println(string(s3))
}

https://play.golang.org/p/ScuxESTW5i

Sur la base de votre dernier commentaire, vous pouvez résoudre ce problème en utilisant un interface{} pour représenter des données autres que le compte, en faisant du compte une chaîne et en plaçant le reste de la goutte dans le interface{} qui acceptera pratiquement tout . Ceci étant dit, Go est un langage typé de manière statique avec un système de typage assez strict et, rappelons-le, vos commentaires selon lesquels "cela peut être n'importe quoi" ne sont pas vrais. JSON ne peut être rien. Il existe un schéma pour chaque élément de JSON et un seul schéma peut définir de nombreuses variantes de JSON. Je vous conseille de prendre le temps de comprendre la structure de vos données plutôt que de pirater quelque chose ensemble sous prétexte que cela ne peut pas être défini alors que c'est tout à fait possible et que c'est probablement assez facile pour quelqu'un qui sait ce qu'il fait.

42
evanmcdonnal
package main

import "encoding/json"

func main() {
    in := []byte(`{ "votes": { "option_A": "3" } }`)
    var raw map[string]interface{}
    json.Unmarshal(in, &raw)
    raw["count"] = 1
    out, _ := json.Marshal(raw)
    println(string(out))
}

https://play.golang.org/p/QUyL3cyTAC

63
fsenart