For your question:-
Can I decode this using the json decoder with [][]interface{}
Yes you can there is nothing wrong with decoding the JSON output. This is an array of JSON.
[["9BC67ACD", "example1", "example1.co.uk", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "FINISHED", 1], ["B339CBA2", "example2", "example2.co.uk", "2018-08-06 08:38:25", "2018-08-06 08:38:24", "2018-08-06 08:38:27", "FINISHED", 1]]
Or you can Unmarshal the JSON into an interface{}. But in both cases you need type assertion to fetch the underlying value of an interface.
package main
import (
"fmt"
"encoding/json"
)
var jsonBytes string = `[["9BC67ACD", "example1", "example1.co.uk", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "2018-08-06 08:46:44", "FINISHED", 1], ["B339CBA2", "example2", "example2.co.uk", "2018-08-06 08:38:25", "2018-08-06 08:38:24", "2018-08-06 08:38:27", "FINISHED", 1]]`
func main() {
var result interface{}
if err := json.Unmarshal([]byte(jsonBytes), &result); err != nil{
fmt.Println(err)
}
fetchValue(result) // This function recursively get the underlying value of an interface.
}
func fetchValue(value interface{}) {
switch value.(type) {
case string:
fmt.Printf("%v is an string
", value.(string))
case bool:
fmt.Printf("%v is bool
", value.(bool))
case float64:
fmt.Printf("%v is float64
", value.(float64))
case []interface{}:
fmt.Printf("%v is a slice of interface
", value)
for _, v := range value.([]interface{}) {
fetchValue(v)
}
case map[string]interface{}:
fmt.Printf("%v is a map
", value)
for _, v := range value.(map[string]interface{}) {
fetchValue(v)
}
default:
fmt.Printf("%v is unknown
", value)
}
}
Playground example