Golang中嵌套结构体无法正确编码的问题

Golang中嵌套结构体无法正确编码的问题 我正在处理一个嵌套结构,并尝试将其编码为JSON字符串。但只有第一个结构被包含在字符串中,没有任何子结构被编码到字符串里。尝试通过data.children[0]data.children[0].children[0]打印出来,数据看起来是正确保存的。问题出在哪里?

type Data struct {
ID      int                 `json:"ID"`
Name    string              `json:"Name"`
children   []Data `json:"children"`
}
type DbData struct{
ID      int                 `mapstructure:"ID" json:"ID" gorm:"primary_key;column:ID"`
Name    string        `mapstructure:"Name" json:"Name" gorm:"primary_key;column:Name"`
ParentID int          `mapstructure:"ParentID" json:"ParentID" gorm:"primary_key;column:ParentID"`
}
func getChildData(Id int) Data{
var data Data
var count = 0
var dbData DbData
childdata := make([]DbData,0)
db.Where("ID = ?",Id).First(&dbData)
db.Where("ParentID = ?",Id).Find(&childdata).Count(&Count)
data.ID = dbData.ID
data.Name = dbData.Name
for i := 0; i < count; i++ {
data .children = append(data .children, getChildData(childdata [i].ID))
}
if count == 0 {
data.children = make([]Data, 0)
}
}

更多关于Golang中嵌套结构体无法正确编码的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

谢谢,刚才没注意到,现在可以了。

更多关于Golang中嵌套结构体无法正确编码的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


由于反射机制的限制,所有你想要进行JSON序列化的字段都需要对外公开,也就是说字段名必须以大写字母开头。

问题在于结构体字段children是小写开头,导致JSON编码器无法访问该字段。在Go语言中,只有导出的字段(首字母大写)才能被JSON包编码。

将结构体修改如下:

type Data struct {
    ID       int    `json:"ID"`
    Name     string `json:"Name"`
    Children []Data `json:"children"`  // 改为大写C
}

同时更新相关代码:

func getChildData(Id int) Data {
    var data Data
    var count = 0
    var dbData DbData
    childdata := make([]DbData, 0)
    
    db.Where("ID = ?", Id).First(&dbData)
    db.Where("ParentID = ?", Id).Find(&childdata).Count(&count)
    
    data.ID = dbData.ID
    data.Name = dbData.Name
    
    for i := 0; i < count; i++ {
        data.Children = append(data.Children, getChildData(childdata[i].ID))
    }
    
    if count == 0 {
        data.Children = make([]Data, 0)
    }
    
    return data  // 需要返回data
}

现在JSON编码器可以正确访问Children字段,嵌套结构体将被完整编码到JSON字符串中。

回到顶部