J'ai un fichier JSON stocké sur la machine locale. J'ai besoin de le lire dans une variable et de le parcourir pour récupérer les valeurs des objets JSON. Si j'utilise la commande Marshal après avoir lu le fichier à l'aide de la méthode ioutil.Readfile, elle donne quelques chiffres en sortie. Ce sont mes quelques tentatives infructueuses,
Tentative 1:
plan, _ := ioutil.ReadFile(filename) // filename is the JSON file to read
var data interface{}
err := json.Unmarshal(plan, data)
if err != nil {
log.Error("Cannot unmarshal the json ", err)
}
fmt.Println(data)
Cela m'a donné l'erreur suivante,
time="2016-12-13T22:13:05-08:00" level=error msg="Cannot unmarshal the json json: Unmarshal(nil)"
<nil>
Tentative 2: j'ai essayé de stocker les valeurs JSON dans une structure puis d'utiliser MarshalIndent
generatePlan, _ := json.MarshalIndent(plan, "", " ") // plan is a pointer to a struct
fmt.Println(string(generatePlan))
Cela me donne la sortie sous forme de chaîne. Mais si je transforme la sortie en chaîne, je ne pourrai pas la boucler en tant qu'objet JSON.
Comment lire un fichier JSON en tant qu'objet JSON dans Golang? Est-il possible de faire ça? Toute aide est appréciée. Merci d'avance!
La valeur à remplir par json.Unmarshal
doit être un pointeur.
De GoDoc :
Unmarshal analyse les données codées JSON et stocke le résultat dans la valeur pointée par v.
Vous devez donc procéder comme suit:
plan, _ := ioutil.ReadFile(filename)
var data interface{}
err := json.Unmarshal(plan, &data)
Votre erreur (Unmarshal (nil)) indique qu'il y a eu un problème lors de la lecture du fichier, veuillez vérifier l'erreur renvoyée par ioutil.ReadFile
Veuillez également noter que lorsque vous utilisez une interface vide dans unmarshal, vous devez utiliser type assertion pour obtenir les valeurs sous-jacentes en tant que types primitifs go.
Pour démarshal JSON dans une valeur d'interface, Unmarshal stocke l'un d'eux dans la valeur d'interface:
bool, for JSON booleans float64, for JSON numbers string, for JSON strings []interface{}, for JSON arrays map[string]interface{}, for JSON objects nil for JSON null
C'est toujours une bien meilleure approche d'utiliser une structure concrète pour remplir votre json en utilisant Unmarshal
.