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


评论