Golang json.Unmarshal没有返回解码数据

时间:2016-09-11 19:28:45

标签: json go

我无法解密从.json文件中读取的json数据

type redisConfig struct {
    host string
    password string
}

func loadRedisConfig() (redisConfig, error){
    b, _ := ioutil.ReadFile("config.json")
    var config redisConfig
    fmt.Println(b)
    fmt.Println(string(b))


    e := json.Unmarshal(b, &config)

    fmt.Println(e)

    fmt.Println(config)
    return config, nil;
}

文件config.json包含:

{
  "host": "example.com",
  "password": "password"
}

我已使用http://jsonlint.com/验证它是有效的JSON。在这里阅读其他类似的问题我发现问题是无效的json,我不认为这是这种情况。

以下是运行代码段的输出:

[123 13 10 32 32 34 104 111 115 116 34 58 32 34 101 120 97 109 112 108 101 46 99 111 109 34 44 13 10 32 32 34 112 97 115 115 119 111 114 100 34 58 32 34 112 97 115 115 119 111 114 100 34 13 10 125]
{
  "host": "example.com",
  "password": "password"
}
<nil>
{ }

config变量包含一个空结构,应该用文件和解码器提供的封送json填充

1 个答案:

答案 0 :(得分:2)

Unmarshal只会设置结构的导出字段 只需将字段设为公共(导出):

type redisConfig struct {
    Host     string
    Password string
}

使用ioutil.ReadFile("config.json")

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

func main() {
    b, err := ioutil.ReadFile("config.json")
    if err != nil {
        panic(err)
    }
    var config redisConfig
    err = json.Unmarshal(b, &config)
    if err != nil {
        panic(err)
    }
    fmt.Println(config)
}

type redisConfig struct {
    Host     string
    Password string
}

输出:

{example.com password123}

尝试The Go Playground

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    //The file config.json contains this:
    str := `{
  "host": "example.com",
  "password": "password123"
}`
    //b, _ := ioutil.ReadFile("config.json")
    b := []byte(str)
    var config redisConfig
    e := json.Unmarshal(b, &config)
    if e != nil {
        panic(e)
    }
    fmt.Println(config)
}

type redisConfig struct {
    Host     string
    Password string
}

输出:

{example.com password123}