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