2013-05-26 4 views
2

J'ai un map[string]map[string]string que j'aimerais convertir en JSON et écrire dans un fichier, et pouvoir lire les données depuis le fichier.Décoder JSON à la carte [chaîne] carte [chaîne] chaîne

Je suis capable d'écrire avec succès au fichier en utilisant les éléments suivants:

func (l *Locker) Save(filename string) error { 
    file, err := os.Create(filename) 
    if err != nil { 
     return err 
    } 
    defer file.Close() 

    encoder := json.NewEncoder(file) 
    // l.data is of type map[string]map[string]string 
    return encoder.Encode(l.data) 
} 

Je ne parviens pas à charger le JSON retour dans la carte. Je l'ai essayé ce qui suit:

func (l *Locker) Load(filename string) error { 
    file, err := os.Open(filename) 
    if err != nil { 
     return err 
    } 
    defer file.Close() 

    decoder := json.NewDecoder(file) 
    return decoder.Decode(l.data) 
} 

chargement d'un fichier JSON avec le contenu {"bar":{"hello":"world"},"foo":{"bar":"new","baz":"extra"}}, et après ce qui précède le contenu de l.data est juste map[]. Comment puis-je décoder avec succès ce JSON en l.data?

Répondre

3

Si vous utilisez json.Unmarshal() à la place, vous pouvez lui transmettre une structure de données à remplir. Voici un lien vers le code ci-dessous, dans le playground.

package main 

import (
    "fmt" 
    "encoding/json" 
    ) 

func main() { 
    src_json := []byte(`{"bar":{"hello":"world"},"foo":{"bar":"new","baz":"extra"}}`) 
    d := map[string]map[string]string{} 
    _ = json.Unmarshal(src_json, &d) 
    // Print out structure 
    for k, v := range d { 
     fmt.Printf("%s\n", k) 
     for k2, v2 := range v { 
      fmt.Printf("\t%s: %s\n", k2, v2) 
     } 
    } 
    fmt.Println("Hello, playground") 
} 
+1

merci! Après avoir travaillé sur votre exemple et avoir regardé mon code, j'ai réalisé que je devais passer un pointeur vers json.Decode mais ce n'était pas le cas. – mfonda

Questions connexes