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