Skip to content

Commit c955815

Browse files
committed
Added json input functionality
1 parent 3720bf8 commit c955815

File tree

4 files changed

+85
-6
lines changed

4 files changed

+85
-6
lines changed

json_converter.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@ import (
44
"encoding/json"
55
)
66

7+
func fromJSONBytes(jsonBytes []byte, parsedData *map[interface{}]interface{}) {
8+
*parsedData = make(map[interface{}]interface{})
9+
var jsonData map[string]interface{}
10+
err := json.Unmarshal(jsonBytes, &jsonData)
11+
if err != nil {
12+
die("error parsing data: ", err)
13+
}
14+
15+
for key, value := range jsonData {
16+
(*parsedData)[key] = fromJSON(value)
17+
}
18+
}
19+
720
func jsonToString(context interface{}) string {
821
out, err := json.Marshal(toJSON(context))
922
if err != nil {
@@ -12,6 +25,27 @@ func jsonToString(context interface{}) string {
1225
return string(out)
1326
}
1427

28+
func fromJSON(context interface{}) interface{} {
29+
switch context.(type) {
30+
case []interface{}:
31+
oldArray := context.([]interface{})
32+
newArray := make([]interface{}, len(oldArray))
33+
for index, value := range oldArray {
34+
newArray[index] = fromJSON(value)
35+
}
36+
return newArray
37+
case map[string]interface{}:
38+
oldMap := context.(map[string]interface{})
39+
newMap := make(map[interface{}]interface{})
40+
for key, value := range oldMap {
41+
newMap[key] = fromJSON(value)
42+
}
43+
return newMap
44+
default:
45+
return context
46+
}
47+
}
48+
1549
func toJSON(context interface{}) interface{} {
1650
switch context.(type) {
1751
case []interface{}:

json_converter_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,35 @@
11
package main
22

33
import (
4+
"encoding/json"
5+
"fmt"
6+
"os"
47
"testing"
58
)
69

10+
func TestJsonFromString(t *testing.T) {
11+
var data = parseJSONData(`
12+
{
13+
"b": {
14+
"c": 2
15+
}
16+
}
17+
`)
18+
assertResult(t, "map[b:map[c:2]]", fmt.Sprintf("%v", data))
19+
}
20+
21+
func TestJsonFromString_withArray(t *testing.T) {
22+
var data = parseJSONData(`
23+
{
24+
"b": [
25+
{ "c": 5 },
26+
{ "c": 6 }
27+
]
28+
}
29+
`)
30+
assertResult(t, "map[b:[map[c:5] map[c:6]]]", fmt.Sprintf("%v", data))
31+
}
32+
733
func TestJsonToString(t *testing.T) {
834
var data = parseData(`
935
---
@@ -22,3 +48,13 @@ b:
2248
`)
2349
assertResult(t, "{\"b\":[{\"item\":\"one\"},{\"item\":\"two\"}]}", jsonToString(data))
2450
}
51+
52+
func parseJSONData(rawData string) map[string]interface{} {
53+
var parsedData map[string]interface{}
54+
err := json.Unmarshal([]byte(rawData), &parsedData)
55+
if err != nil {
56+
fmt.Println("Error parsing json: ", err)
57+
os.Exit(1)
58+
}
59+
return parsedData
60+
}

sample.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"a":"Easy! as one two three","b":{"c":2,"d":[3,4],"e":[{"name":"fred","value":3},{"name":"sam","value":4}]}}

yaml.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
var trimOutput = true
1414
var writeInplace = false
1515
var writeScript = ""
16+
var inputJSON = false
1617
var outputToJSON = false
1718

1819
func main() {
@@ -61,6 +62,8 @@ a.b.e:
6162
var rootCmd = &cobra.Command{Use: "yaml"}
6263
rootCmd.PersistentFlags().BoolVarP(&trimOutput, "trim", "t", true, "trim yaml output")
6364
rootCmd.PersistentFlags().BoolVarP(&outputToJSON, "tojson", "j", false, "output as json")
65+
rootCmd.PersistentFlags().BoolVarP(&inputJSON, "fromjson", "J", false, "input as json")
66+
6467
rootCmd.AddCommand(cmdRead, cmdWrite)
6568
rootCmd.Execute()
6669
}
@@ -72,7 +75,7 @@ func readProperty(cmd *cobra.Command, args []string) {
7275
func read(args []string) interface{} {
7376
var parsedData map[interface{}]interface{}
7477

75-
readYaml(args[0], &parsedData)
78+
readData(args[0], &parsedData, inputJSON)
7679

7780
if len(args) == 1 {
7881
return parsedData
@@ -95,7 +98,7 @@ func writeProperty(cmd *cobra.Command, args []string) {
9598
func updateYaml(args []string) interface{} {
9699
var writeCommands map[string]interface{}
97100
if writeScript != "" {
98-
readYaml(writeScript, &writeCommands)
101+
readData(writeScript, &writeCommands, false)
99102
} else if len(args) < 3 {
100103
die("Must provide <filename> <path_to_update> <value>")
101104
} else {
@@ -104,7 +107,7 @@ func updateYaml(args []string) interface{} {
104107
}
105108

106109
var parsedData map[interface{}]interface{}
107-
readYaml(args[0], &parsedData)
110+
readData(args[0], &parsedData, inputJSON)
108111

109112
for path, value := range writeCommands {
110113
var paths = parsePath(path)
@@ -154,7 +157,7 @@ func yamlToString(context interface{}) string {
154157
return outStr
155158
}
156159

157-
func readYaml(filename string, parsedData interface{}) {
160+
func readData(filename string, parsedData interface{}, readAsJSON bool) {
158161
if filename == "" {
159162
die("Must provide filename")
160163
}
@@ -166,9 +169,14 @@ func readYaml(filename string, parsedData interface{}) {
166169
rawData = readFile(filename)
167170
}
168171

169-
err := yaml.Unmarshal([]byte(rawData), parsedData)
172+
var err interface{}
173+
if readAsJSON {
174+
fromJSONBytes([]byte(rawData), parsedData.(*map[interface{}]interface{}))
175+
} else {
176+
err = yaml.Unmarshal([]byte(rawData), parsedData)
177+
}
170178
if err != nil {
171-
die("error: %v", err)
179+
die("error parsing data: ", err)
172180
}
173181
}
174182

0 commit comments

Comments
 (0)