output: jsonify when value is slice or map
Fixes #46 - output value as json when the value of key/row is slice or
map for nested structures.
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
diff --git a/cmd/output.go b/cmd/output.go
index 04e9b9c..63b4404 100644
--- a/cmd/output.go
+++ b/cmd/output.go
@@ -30,6 +30,16 @@
"github.com/olekukonko/tablewriter"
)
+func jsonify(value interface{}) string {
+ if reflect.TypeOf(value).Kind() == reflect.Map || reflect.TypeOf(value).Kind() == reflect.Slice {
+ jsonStr, err := json.Marshal(value)
+ if err == nil {
+ value = string(jsonStr)
+ }
+ }
+ return fmt.Sprintf("%v", value)
+}
+
func printJSON(response map[string]interface{}) {
enc := json.NewEncoder(os.Stdout)
enc.SetEscapeHTML(false)
@@ -46,7 +56,7 @@
if !ok {
continue
}
- fmt.Printf("%s:\n", k)
+ fmt.Printf("%v:\n", k)
var header []string
for _, item := range items {
row, ok := item.(map[string]interface{})
@@ -63,12 +73,12 @@
}
var rowArray []string
for _, field := range header {
- rowArray = append(rowArray, fmt.Sprintf("%v", row[field]))
+ rowArray = append(rowArray, jsonify(row[field]))
}
table.Append(rowArray)
}
} else {
- fmt.Printf("%s = %v\n", k, v)
+ fmt.Printf("%v = %v\n", k, v)
}
}
table.Render()
@@ -78,7 +88,7 @@
for k, v := range response {
valueType := reflect.TypeOf(v)
if valueType.Kind() == reflect.Slice {
- fmt.Printf("%s:\n", k)
+ fmt.Printf("%v:\n", k)
for idx, item := range v.([]interface{}) {
if idx > 0 {
fmt.Println("================================================================================")
@@ -86,14 +96,14 @@
row, isMap := item.(map[string]interface{})
if isMap {
for field, value := range row {
- fmt.Printf("%s = %v\n", field, value)
+ fmt.Printf("%s = %v\n", field, jsonify(value))
}
} else {
fmt.Printf("%v\n", item)
}
}
} else {
- fmt.Printf("%s = %v\n", k, v)
+ fmt.Printf("%v = %v\n", k, jsonify(v))
}
}
}
@@ -123,7 +133,7 @@
}
var values []string
for _, key := range header {
- values = append(values, fmt.Sprintf("%v", row[strings.ToLower(key)]))
+ values = append(values, jsonify(row[strings.ToLower(key)]))
}
fmt.Fprintln(w, strings.Join(values, "\t"))
}
@@ -156,7 +166,7 @@
}
var values []string
for _, key := range header {
- values = append(values, fmt.Sprintf("%v", row[key]))
+ values = append(values, jsonify(row[key]))
}
fmt.Println(strings.Join(values, ","))
}