如何解析层次结构数据

时间:2019-03-09 18:10:21

标签: oracle go

在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数据库。我也创建结构。我的问题是如何知道组织是否有孩子?

main.go:

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)

1 个答案:

答案 0 :(得分:0)

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

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