title: Golang - Unmarshall JSON with changing key value
body: <p>I'm trying to unmarshall JSON into a struct, but it's proving difficult because the outer JSON key changes and I only started go a week ago. This is my manual attempt:</p>
  
  <pre><code>import (
      "encoding/json"
      "fmt"
      "strconv"
  )
  
  type Device struct {
      localUUID       string
      applicationUUID string
      externalUUID    string
      commit          string
      lastSeen        string
      state           string
      progress        float32
  }
  
  func main() {
      devices := make([]*Device, 0, 10)
  
      b := []byte(`{
          "5417871461137421886": {
              "applicationUUID": "test_applicationUUID",
              "commit": "test_commit",
              "lastSeen": "test_lastSeen",
              "localUUID": "E4:F5:13:8E:F5:43",
              "progress": "3.5",
              "externalUUID": "test_externalUUID",
              "state": "test_state"
          },
          "5632882567440442530": {
              "applicationUUID": "test_applicationUUID",
              "commit": "test_commit",
              "lastSeen": "test_lastSeen",
              "localUUID": "E4:F5:13:8E:F5:42",
              "progress": "3.5",
              "externalUUID": "test_externalUUID",
              "state": "test_state"
          },
          "8912255216147730520": {
              "applicationUUID": "test_applicationUUID",
              "commit": "test_commit",
              "lastSeen": "test_lastSeen",
              "localUUID": "E4:F5:13:8E:F5:41",
              "progress": "3.5",
              "externalUUID": "test_externalUUID",
              "state": "test_state"
          }
      }`)
  
      var f interface{}
      json.Unmarshal(b, &amp;f)
      outer := f.(map[string]interface{})
      for _, value := range outer {
          inner := value.(map[string]interface{})
          device := &amp;Device{}
          device.localUUID = inner["localUUID"].(string)
          device.applicationUUID = inner["applicationUUID"].(string)
          device.externalUUID = inner["externalUUID"].(string)
          device.commit = inner["commit"].(string)
          device.lastSeen = inner["lastSeen"].(string)
          device.state = inner["state"].(string)
          f, _ := strconv.ParseFloat(inner["progress"].(string), 32)
          device.progress = float32(f)
  
          devices = append(devices, device)
      }
  
      for _, device := range devices {
          fmt.Println(device)
      }
  }
  </code></pre>
  
  <p>Is there a way to ignore the keys and iterate over the values instead, allowing me to use json.Unmarshal(b, &amp;Device)?</p>