英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论