dongwang788787 2019-03-09 18:10
浏览 69
已采纳

如何解析层次结构数据

In Oracle, I have such table:

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

This table show the hierarchy of organizations. I need to create a tree-like nested JSON response in my Go application:

[
    {
        "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
    }
]

I make query to Oracle database. I also create struct. My question is how to know if an organization has children or not?

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条回答 默认 最新

  • dongzhan8620 2019-03-17 14:14
    关注

    Finally, I found solution:

    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))
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的