为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析层级数据

如何解析层级数据

Go
ABOUTYOU 2023-06-12 17:01:34
在 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 []Organizationfor rows.Next() {    var organization Organization    err = rows.Scan(&organization.ID, &organization.Name, ???)    if err != nil {        fmt.Println(err)        return    }}organizations = append(organizations, organization)
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

最后,我找到了解决方案:


package main


import (

    "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))

}



查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信