英文:
getting nullable object on json unmarshal in golang
问题
以下是翻译好的内容:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
type student struct {
ID string `json:"id"`
Name string `json:"name"`
Standard string `json:"std"`
}
type cls struct {
st student `json:"cls"`
}
func getValues() (cls, error) {
var clss cls
dataBytes, err := ioutil.ReadFile("studentclass.json")
if err != nil {
fmt.Printf("文件错误:%v\n", err)
os.Exit(1)
}
err = json.Unmarshal(dataBytes, &clss)
if err != nil {
fmt.Errorf("%s", err)
}
return clss, err
}
func main() {
s, err := getValues()
fmt.Printf("%#v\n", s)
fmt.Println(err)
}
{
"cls": {
"id": "1",
"name": "test",
"std": "0"
}
}
当我运行 go run jsonTestParse.go
时,它给出了以下输出:
main.cls{st:main.student{ID:"", Name:"", Standard:""}}
<nil>
请帮我解释为什么我得到了这个空对象:
main.cls{st:main.student{ID:"", Name:"", Standard:""}}
而不是这个:
main.cls{st:main.student{ID:"1", Name:"test", Standard:"0"}}
另外,如何获取这些值会很有帮助?
英文:
> Go code(jsonTestParse.go)
>
> (this is just a test example I made, please don't argue that I should
> use list of students in cls struct)
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
type student struct {
ID string `json:"id"`
Name string `json:"name"`
Standard string `json:"std"`
}
type cls struct {
st student `json:"cls"`
}
func getValues() (cls, error) {
var clss cls
dataBytes, err := ioutil.ReadFile("studentclass.json")
if err != nil {
fmt.Printf("File error: %v\n", err)
os.Exit(1)
}
err = json.Unmarshal(dataBytes, &clss)
if err != nil {
fmt.Errorf("%s", err)
}
return clss, err
}
func main() {
s, err := getValues()
fmt.Printf("%#v\n", s)
fmt.Println(err)
}
> Json File (studentclass.json)
{
"cls": {
"id": "1",
"name": "test",
"std": "0"
}
}
When I run this code with go run jsonTestParse.go
it gives me this output:
main.cls{st:main.student{ID:"", Name:"", Standard:""}}
<nil>
Please help me why I'm getting this blank object
main.cls{st:main.student{ID:"", Name:"", Standard:""}}
instead of this
main.cls{st:main.student{ID:"1", Name:"test", Standard:"0"}}
Plus It would be great to help on how to get these values?
答案1
得分: 3
这是因为你的 cls 结构体中嵌入了私有结构体(小写未导出字段) student st
,将其改为导出字段应该可以解决问题,即:
type cls struct {
// St 字段将被反序列化
St student `json:"cls"`
}
在 playground 中查看。
英文:
That is because your cls struct has embedded private struct (lower case unexported field) of student st
, change to exported field should work, that is:
type cls struct {
// St field will be unmarshalled
St student `json:"cls"`
}
See in playground
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论