I have JSON coming from a graph database and it only returns lists. Here is an example query and response:
{
Course(func: eq(XID, "1")) {
Name
Holes : Hole {
Number
Tee {
Color
Basket @facets(distance) {
Designation
}
}
}
}
}
This query looks up by ID so it can only return one result but the nature of the database backend means it will always return a list like so:
{
"Course": [
{
"Name": "NAD",
"Holes": [
{
"Number": 1,
"Tee": [
{
"Color": "Blue",
"Basket": [
{
"Designation": "A",
"Basket|distance": "70"
}
]
},
{
"Color": "Red",
"Basket": [
{
"Designation": "A",
"Basket|distance": "69"
}
]
}
]
},
{
"Number": 2,
"Tee": [
{
"Color": "Blue",
"Basket": [
{
"Designation": "A",
"Basket|distance": "79"
},
{
"Designation": "B",
"Basket|distance": "89"
}
]
},
{
"Color": "Red",
"Basket": [
{
"Designation": "A",
"Basket|distance": "79"
},
{
"Designation": "B",
"Basket|distance": "95"
}
]
}
]
}
]
}
]
}
I want to unmarshal that single Course to a struct:
type Course struct {
Name string `json:"Name"`
Holes []struct {
Number int `json:"Number"`
Tee []struct {
Color string `json:"Color"`
Basket []struct {
Designation string `json:"Designation"`
BasketDistance string `json:"Basket|distance"`
} `json:"Basket"`
} `json:"Tee"`
} `json:"Holes"`
}
I tried making a temporary struct that is just a list of courses to pull out the correct JSON by index but I get a really generic runtime error that the object can't be unmarshaled to that type.
I believe it would be relatively easy to convert it to a []map[string]interface{}
then unmarshal to a Course from there by specifying the JSONRawMessage type but doesn't that suffer a performance penalty? What's the most performant way to solve this problem?