Golang: simple map operations

Hi there, today we'd like to introduce you a package which will help you to deal some maps in a json path way.

Let's assume you have a response from some service:

var document map[string]interface{}
err := json.Unmarshal(someCrazyResponse, &document)
fmt.Println(document)

and your document map is

map[string]interface{}{
	"one": []map[string]interface{}{
		{
			"two": []map[string]interface{}{
				{"three": "got three"},
				{"four": "got four"},
			},
		},
		{
			"two": []map[string]interface{}{
				{"five": "got five"},
				{"six": "got six"},
			},
		},
		{
			"two": []map[string]interface{}{
				{"seven": "got seven"},
				{"eight": "got eight"},
			},
		},
		{
			"three": []map[string]interface{}{
				{"four": map[string]interface{}{
					"five": "six",
				}},
				{"seven": map[string]interface{}{
					"eight": "ten",
				}},
			},
		},
	},
}

You need to extract a property located in one[2].two[1].eight which is currently ten

In golang it's a quite long string:

myVar := document["one"].([]map[string]interface{})[2]["two"].([]map[string]interface{})[1]["eight"]

It also can panic because in some of these documents there is no such property one[3].two

The package

So, we have developed a go-json-map package.

Using it you can:

  • get a property

      myVar, err := GetProperty(document, "one[2].two[1].eight")
    
  • create some property which does not exist in a document

      err := CreateProperty(document, "path.which.does.not.exist", "some value")
    
      err := CreateProperty(document, "path/which/does/not/exist/separated/using/slashes/", "some value", "/")
    
  • update missing or existing property

      err := UpdateProperty(document, "path.which.should.be.updated", "some value")
    
      err := UpdateProperty(document, "path/which/does/not/exist/separated/using/slashes/", "some value", "/")
    
      err := UpdateProperty(document, "one[2].two[1].eight",  "eleven")
      
      err := UpdateProperty(document, "one[3].three[2].four", []int{1,2,3,4})
    
  • delete a property

      err := DeleteProperty(document, "one[3].three[1].seven.eight")
    

Conclusion

This package allows you to work with maps a bit easier :D