解码JSON以映射[string] map [string]字符串

时间:2013-05-26 23:45:39

标签: go

我有map[string]map[string]string我希望能够转换为JSON并写入文件,并能够从文件中读回数据。

我已经能够使用以下内容成功写入文件:

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

加载包含内容{"bar":{"hello":"world"},"foo":{"bar":"new","baz":"extra"}}的JSON文件,在上述内容之后,l.data的内容仅为map[]。如何将此JSON成功解码为l.data

1 个答案:

答案 0 :(得分: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")
}