如何在不定义Golang结构的情况下读取json的“接口”映射?

Following this tutorial I'm trying to read a json file in Golang. It says there are two ways of doing that:

  1. unmarshal the JSON using a set of predefined structs
  2. or unmarshal the JSON using a map[string]interface{}

Since I'll probably have a lot of different json formats I prefer to interpret it on the fly. So I now have the following code:

package main

import (
    "fmt"
    "os"
    "io/ioutil"
    "encoding/json"
)

func main() {
    // Open our jsonFile
    jsonFile, err := os.Open("users.json")
    // if we os.Open returns an error then handle it
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("Successfully Opened users.json")
    // defer the closing of our jsonFile so that we can parse it later on
    defer jsonFile.Close()

    byteValue, _ := ioutil.ReadAll(jsonFile)

    var result map[string]interface{}
    json.Unmarshal([]byte(byteValue), &result)

    fmt.Println(result["users"])
    fmt.Printf("%T
", result["users"])
}

This prints out:

Successfully Opened users.json
[map[type:Reader age:23 social:map[facebook:https://facebook.com twitter:https://twitter.com] name:Elliot] map[name:Fraser type:Author age:17 social:map[facebook:https://facebook.com twitter:https://twitter.com]]]
[]interface {}

At this point I don't understand how I can read the age of the first user (23). I tried some variations:

fmt.Println(result["users"][0])
fmt.Println(result["users"][0].age)

But apparently, type interface {} does not support indexing.

Is there a way that I can access the items in the json without defining the structure?

Probably you want

fmt.Println(result["users"].(map[string]interface{})["age"])

or

fmt.Println(result[0].(map[string]interface{})["age"])

As the JSON is a map of maps the type of the leaf nodes is interface{} and so has to be converted to map[string]interface{} in order to lookup a key

Defining a struct is much easier. My top tip for doing this is to use a website that converts JSON to a Go struct definition, like Json-To-Go