I would say the most idiomatic way is having defined structs and using encoding/json. Even when you don't know the json schema in advance you can still parse it into an interface{}.

Here's an example: http://play.golang.org/p/jrqBcPuQei

It's definitely safer, but it's a living hell having to define a class for each possible json structure in Java with gson.

Not sure where Java came into the conversation but I found a service[1] which I find really helpful for generating Golang structs from JSON. There is also a CLI tool[2] that does the same.

[1]http://mholt.github.io/json-to-go/

[2]https://github.com/ChimeraCoder/gojson