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