2013-05-26 2 views
2

У меня есть map[string]map[string]string, что я хотел бы иметь возможность конвертировать в JSON и записывать в файл и иметь возможность считывать данные из файла.Декодирование JSON для отображения [string] map [string] string

Я был в состоянии успешно выполнить запись в файл, используя следующие:

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) 
} 

У меня возникли проблемы с загрузкой в ​​JSON обратно на карту. Я попытался следующие:

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) 
} 

загрузки в формате JSON файл с содержимым {"bar":{"hello":"world"},"foo":{"bar":"new","baz":"extra"}}, и после того, как выше содержание l.data просто map[]. Как я могу успешно декодировать этот JSON в l.data?

ответ

3

Если вы используете json.Unmarshal(), вместо этого вы можете передать ему структуру данных для заполнения. Вот ссылка на код ниже, в 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

спасибо! После работы с вашим примером и взглядом на мой код, я понял, что мне нужно передать указатель на json.Decode, но это не так. – mfonda

Смежные вопросы