web-dev-qa-db-fra.com

Comment lire un fichier json en tant qu'objet json dans Golang

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!

18
Aishwarya

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.

28
John S Perayil