4 回答
TA贡献1850条经验 获得超11个赞
声明匹配数据结构的 Go 类型。JSON 数据具有三个级别的对象。使用映射来表示 JSON 中的顶级对象,因为顶级对象具有任意键。将结构用于 JSON 中的低级别对象。
使用 JSON 字段标签将 JSON 中使用的 snake case 名称映射到更惯用的 Go 名称。 导出字段,以便 JSON 包可以访问它们。
type Record struct {
Name string `json:"student_name"`
Number uint32 `json:"student_number"`
DOB string `json:"student_dob"`
Email string `json:"student_email"`
}
type ID struct {
Record Record
}
...
var records map[string]ID
err := json.Unmarshal(jsonFile, &records)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", records)
TA贡献1875条经验 获得超3个赞
首先,您的 JSON 无效。与 GoLang 结构不同,您不需要,在最终对象之后放置。
{ “394885”:{ “记录”:{ “student_name”:“Daryl Jones”,“student_number”:123884,“student_dob”:“12/10/1982”,“student_email”:“djones@school.ac.uk “ }
} }
其次, var records应该通过完全按照 JSON 对象中命名的方式命名结构中的字段,或者使用属性来准确地对 JSON 建模。
你的 JSON 的外部不是 type id,它是 typemap[string]id
id没有recordid字段,但是它有一个record字段,但是,如果要将 JSON 序列化到结构中,则必须导出结构的字段(以大写字母开头)。
这是属性派上用场的地方,
type id struct {
Record []record `json:"record"`
}
与record结构相同,
type record struct {
Name string `json:"student_name"`
Email string `json:"student_email"`
// You get the idea...
}
defer第三,您在打开文件后立即放置语句,将其放在块的末尾会破坏目的。
TA贡献1777条经验 获得超10个赞
jsonquery包可以轻松地从 JSON 文档中提取数据,并且它不依赖于定义的结构对象。
func main() {
s := `{
"394885":
{
"record":
{
"student_name": "Daryl Jones",
"student_number": 123884,
"student_dob": "12/10/1982",
"student_email": "djones@school.ac.uk"
}
}
}`
doc, err := jsonquery.Parse(strings.NewReader(s))
if err != nil {
panic(err)
}
nodes := jsonquery.Find(doc, "*")
for _, n := range nodes {
fmt.Printf("id: %s \n", n.Data)
name := jsonquery.FindOne(n, "//student_name") // Find student name node
fmt.Printf("student name: %s\n", name.InnerText())
number := jsonquery.FindOne(n, "//student_number") // Find node for student number
fmt.Printf("student number: %s\n", number.InnerText())
}
}
TA贡献1831条经验 获得超10个赞
您可以将此结构用于您的 id 类型
type id struct {
record map[string]record
}
编辑
这是带有一些解释的工作解决方案:
由于您有一个多级 json,您可以将其解析为嵌套结构。
{
"student_name": "Daryl Jones",
"student_number": 123884,
"student_dob": "12/10/1982",
"student_email": "djones@school.ac.uk"
}
要解析 json 的这一部分,你需要这个结构
type record struct {
Name string `json:"student_name"`
Number uint32 `json:"student_number"`
Dob string `json:"student_dob"`
Email string `json:"student_email"`
}
必须导出字段(以大写字母开头)并具有与 json 属性匹配的 json 标记。
{
"record":
{
"student_name": "Daryl Jones",
"student_number": 123884,
"student_dob": "12/10/1982",
"student_email": "djones@school.ac.uk"
}
}
为了让这部分工作,你需要一个像这样的嵌套结构
type id struct {
Record record
}
文件名再次导出,但由于它与您的 json 属性匹配,因此您不需要标签。
{
"394885":
{
"record":
{
"student_name": "Daryl Jones",
"student_number": 123884,
"student_dob": "12/10/1982",
"student_email": "djones@school.ac.uk"
}
}
}
由于顶级属性名称是学生 ID,因此您可以使用映射而不是结构
var records map[string]id
并确保你没有尾随逗号,因为这在 json 规范中是不允许的
- 4 回答
- 0 关注
- 199 浏览
添加回答
举报