json.Unmarshal工作不正常

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

json.Unmarshall not working properly

问题

你的代码中存在一个问题,导致输出显示为空对象。问题出在你定义的Test结构体的字段首字母小写。在Go语言中,首字母小写的字段是私有的,无法被JSON解析器访问和填充。你需要将字段的首字母改为大写,以便JSON解析器可以正确地填充数据。

修改后的代码如下:

type Test struct {
    One   string
    Two   string
    Three string
}

res, err := http.Get("http://localhost/d/")
if err != nil {
    log.Fatal(err)
}
defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)
if err != nil {
    log.Fatal(err)
}

var data Test
err = json.Unmarshal(body, &data)
if err != nil {
    fmt.Printf("%T\n%s\n%#v\n", err, err, err)
    switch v := err.(type) {
    case *json.SyntaxError:
        fmt.Println(string(body[v.Offset-40 : v.Offset]))
    }
}

fmt.Println("response:")
fmt.Println(string(body))
fmt.Println("type:")
fmt.Println(data)

这样修改后,你应该能够正确地将JSON数据转换为Test类型并输出结果了。

英文:

I am reading a json document from localhost and trying to convert it to a Test type:

type Test struct {
    one string
    two string
    three string
}

res, err := http.Get("http://localhost/d/")
perror(err)
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
perror(err)
var data Test
err = json.Unmarshal(body, &data)
if err != nil {
	fmt.Printf("%T\n%s\n%#v\n",err, err, err)
	switch v := err.(type){
	case *json.SyntaxError:
		fmt.Println(string(body[v.Offset - 40:v.Offset]))
	}
}


fmt.Println("response:")
fmt.Println(string(body))
fmt.Println("type:")
fmt.Println(data)

But the output shows an empty object:

response:
{
    "one" : "one thing",
    "two" : "two things",
    "three" : "3 things"
    
}
type:
{  }

What am I doing wrong?

答案1

得分: 2

你需要导出结构体字段,并使它们以大写字母开头。

英文:

You have to export the struct fields, make them start with an uppercase letter.

huangapple
  • 本文由 发表于 2014年9月26日 08:58:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/26050469.html
匿名

发表评论

匿名网友

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

确定