Parsing into a struct is very convenient but sometimes you don’t know the structure of JSON document upfront.
For arbitrary JSON documents we can decode into a map[string]interface{}, which can represent all valid JSON documents.
https://codeeval.dev/gist/d6c8c4a63a57fb264e105b568bbf176d
For basic JSON types, the value in the map is bool, int, float64 or string.
For JSON arrays, the value is []interface{}.
For JSON dictionaries, the value is (again) map[string]interface{}.
This approach is flexible but dealing with map[string]interface{} to access values is rather painful.