猿问

如何解析层级数据

在 Oracle 中,我有这样的表:


| organization_id | ogranization_name | parent_id | level |

|-----------------|-------------------|-----------|-------|

| 1               | Facebook          |           | 0     |

| 2               | Instagram         | 1         | 1     |

| 3               | Whatsapp          | 1         | 1     |

| 4               | Dynamic           | 2         | 2     |

| 5               | Google            |           | 0     |

此表显示组织的层次结构。我需要在我的 Go 应用程序中创建一个树状嵌套的 JSON 响应:


[

    {

        "organization_id": 1

        "ogranization_name": "Facebook",

        "childs": [

            {

                "organization_id": 2,

                "ogranization_name": "Instagram",

                "childs": null

            },

            {

                "organization_id": 3,

                "ogranization_name": "Whatsapp",

                "childs": [

                    {

                        "organization_id": 4,

                        "ogranization_name": "Dynamic",

                        "childs": null

                    }

                ]

            }

        ]

    },

    {

        "organization_id": 5

        "ogranization_name": "Google",

        "childs": null

    }

]

我查询 Oracle 数据库。我也创建结构。我的问题是如何知道一个组织是否有孩子?


主要去:


type Organisation struct {

    ID       int            `json:"organization_id"`

    Name     string         `json:"ogranization_name"`

    Children []Organisation `json:"childs"`

}


rows,err := db.Query("select * from ORG_TABLE")


if err != nil {

    fmt.Println(err)

    return

}


var organizations []Organization


for rows.Next() {

    var organization Organization


    err = rows.Scan(&organization.ID, &organization.Name, ???)


    if err != nil {

        fmt.Println(err)

        return

    }

}


organizations = append(organizations, organization)


ABOUTYOU
浏览 120回答 1
1回答

智慧大石

最后,我找到了解决方案:package mainimport (    "database/sql"    "encoding/json"    "fmt"    "log"    "sort"    _ "github.com/mattn/go-sqlite3")type Organization struct {    ID       int             `json:"organization_id"`    Name     string          `json:"organization_name"`    Rang     int             `json:"organization_rang"`    Children []*Organization `json:"children"`}func main() {    db, err := sql.Open("sqlite3", "./database")    if err != nil {        log.Fatal(err)    }    defer db.Close()    rows, err := db.Query("select ORGANIZATION_ID,ORGANIZATION_NAME,ORGANIZATION_RANG,PARENT_ORGANIZATION_ID from ORG")    if err != nil {        log.Fatal(err)    }    defer rows.Close()    orgs := map[int]*Organization{}    for rows.Next() {        organization := &Organization{}        var parentID sql.NullInt64        if err = rows.Scan(&organization.ID, &organization.Name, &organization.Rang, &parentID); err != nil {            log.Fatal(err)        }        if parentID.Valid {            if parentOrg, ok := orgs[int(parentID.Int64)]; ok {                parentOrg.Children = append(parentOrg.Children, organization)            } else {                orgs[int(parentID.Int64)] = &Organization{ID: int(parentID.Int64)}                orgs[int(parentID.Int64)].Children = append(orgs[int(parentID.Int64)].Children, organization)            }        }        if _, ok := orgs[organization.ID]; ok {            orgs[organization.ID].Name = organization.Name            orgs[organization.ID].Rang = organization.Rang            continue        }        orgs[organization.ID] = organization    }    IDs := []int{}    for k := range orgs {        IDs = append(IDs, k)    }    sort.Ints(IDs)    organizations := []Organization{}    for _, ID := range IDs {        if len(orgs[ID].Children) > 0 && orgs[ID].Rang == 1 {            organizations = append(organizations, *orgs[ID])        }    }    content, err := json.MarshalIndent(organizations, "", "  ")    if err != nil {        log.Fatal(err)    }    fmt.Println(string(content))}
随时随地看视频慕课网APP

相关分类

Go
我要回答