在Golang中出现JSON解析错误

huangapple go评论82阅读模式
英文:

Error with JSON parsing in Golang

问题

我开发了这段代码:

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

type Client struct{
    host string
    key string
    secrete string
    username string
    password string
}

type Config struct{
    Client []Client
}

func main(){
    content, err := ioutil.ReadFile("conf2.json")
    if err!=nil{
        fmt.Print("Error:",err)
    }
    var conf Config
    err=json.Unmarshal(content, &conf)
    if err!=nil{
        fmt.Print("Error:",err)
    }
    json.Unmarshal(content, &conf)
    fmt.Println(conf.Client[0].host)
}

我想解析并打印出我的 JSON 中的第一个主机详细信息,JSON 的内容如下:

{
    "Client" :
    [
        {"host":"192.168.1.2"},			
        {"key":"abcdf"},
        {"secrete":"9F6w"},
        {"username":"user"},
        {"password":"password"}
    ]
}

但是我得到了一个空字符串。有人知道原因吗?

英文:

I develop this code:

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

type Client struct{
    host string
    key string
    secrete string
    username string
    password string
}

type Config struct{
    Client []Client
}

func main(){
    content, err := ioutil.ReadFile("conf2.json")
    if err!=nil{
        fmt.Print("Error:",err)
    }
    var conf Config
    err=json.Unmarshal(content, &conf)
    if err!=nil{
        fmt.Print("Error:",err)
    }
    json.Unmarshal(content, &conf)
    fmt.Println(conf.Client[0].host)
}

to parse and print the first host detail from my json, that looks like this:

> {
> "Client" :
> [
> {"host":"192.168.1.2"},
> {"key":"abcdf"},
> {"secrete":"9F6w"},
> {"username":"user"},
> {"password":"password"}
> ]
> }

But I got an empty string. Could someone know the reason?

答案1

得分: 4

三个需要修复的问题:

  • json.Unmarshal要求结构体字段首字母大写才能被导出,否则它们会被忽略。
  • 你需要在字段后面添加json:"<name>"的指定符,这样解析器才知道结构体字段与JSON的映射关系。
  • 你的JSON数据创建了多个只填充了一个字段的客户端,而不是一个填充了所有字段的客户端。

参考示例:https://play.golang.org/p/oY7SppWNDC

英文:

Three things to fix:

  • json.Unmarshal requires the struct fields to be capitalized to be exported or they are ignored
  • You need the json:&quot;&lt;name&gt;&quot; specifier after the fields so the unmarshal knows the struct field to json mapping
  • Your json was making multiple clients with one field filled in instead of one client with all the fields filled in

See example: https://play.golang.org/p/oY7SppWNDC

答案2

得分: 1

这是我的问题的解决方案:

package main

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

type Client struct {
  Host     string `json:"host"`
  Key      string `json:"apikey"`
  Secret   string `json:"secret"`
  Username string `json:"username"`
  Password string `json:"password"`
}

type Config struct {
  Client Client `json:"Client"`
}

func main() {
  jsonmsg, err := ioutil.ReadFile("conf2.json")

  conf := new(Config)
  err = json.Unmarshal([]byte(jsonmsg), &conf)
  if err != nil {
    fmt.Print("Error:", err)
  }
  fmt.Printf("%+v\n%+v\n%+v\n%+v\n%+v\n", conf.Client.Host, conf.Client.Key, conf.Client.Secret, conf.Client.Username, conf.Client.Password)
}

这是你的问题的解决方案的代码。它是一个使用Go语言编写的程序,用于读取名为"conf2.json"的配置文件,并解析其中的JSON数据。然后,它将解析后的数据打印出来,包括Client结构体中的Host、Key、Secret、Username和Password字段的值。

英文:

Here, it is the solution to my problem:
package main

import (
  &quot;fmt&quot;
  &quot;io/ioutil&quot;
  &quot;encoding/json&quot;
)

type Client struct {
  Host     string `json:&quot;host&quot;`
  Key      string `json:&quot;apikey&quot;`
  Secret  string `json:&quot;secret&quot;`
  Username string `json:&quot;username&quot;`
  Password string `json:&quot;password&quot;`
}

type Config struct {
  Client Client `json:&quot;Client&quot;`
}

func main(){
  jsonmsg, err := ioutil.ReadFile(&quot;conf2.json&quot;)

  conf := new(Config)
  err = json.Unmarshal([]byte(jsonmsg), &amp;conf)
  if err != nil {
    fmt.Print(&quot;Error:&quot;, err)
  }
  fmt.Printf(&quot;%+v\n%+v\n%+v\n%+v\n%+v\n&quot;, conf.Client.Host, conf.Client.Key, conf.Client.Secret, conf.Client.Username,conf.Client.Password)
}

huangapple
  • 本文由 发表于 2016年2月24日 06:29:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/35589541.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定