获取JSON动态键名作为字符串?

For example:

{"id":
    {"12345678901234":
       {"Account":"asdf",
       "Password":"qwerty"
       "LastSeen":"1397621470",
       }
    }
}

A program I've been trying to make needs to get the id as a string and then later use it to check the time in LastSeen. I've tried using simplejson and jsonq,but still cant figure out how to do that.

You can use RawMessage and make it much simpiler (play with it) :

package main

import (
    "encoding/json"
    "fmt"
)

var data []byte = []byte(`{"id": {"12345678901234": {"Account":"asdf", "Password":"qwerty", "LastSeen":"1397621470"}}}`)

type Message struct {
    Id   string
    Info struct {
        Account  string
        Password string
        LastSeen string
    }
}

func main() {
    var (
        tmpmsg struct {
            Data map[string]json.RawMessage `json:"id"`
        }
        msg Message
    )
    if err := json.Unmarshal(data, &tmpmsg); err != nil {
        panic(err) //you probably wanna use or something instead
    }

    for id, raw := range tmpmsg.Data {
        msg.Id = id
        if err := json.Unmarshal(raw, &msg.Info); err != nil {
            panic(err)
        }
    }
    fmt.Printf("%+v
", msg)

}

Looking at the Golang blog post on JSON here it can be done using the encoding/json package. I created a small program to do this as follows:

package main

import (
    "encoding/json"
    "fmt"
)

var data []byte = []byte(`{"id": {"12345678901234": {"Account":"asdf", "Password":"qwerty", "LastSeen":"1397621470"}}}`)

type Message struct {
    id string
    LastSeen int64
} 

var m Message

func main() {
    var i interface {}
    err := json.Unmarshal(data, &i)
    if err != nil {
        println("Error decoding data")
        fmt.Printf("%s", err.Error())
        return
    }
    m := i.(map[string]interface{})

    for k, v := range m {
        println(k)
        im := v.(map[string]interface{})
        for ik, iv := range im {
            println("\t", ik)
            jm := iv.(map[string]interface{})
            for jk, jv := range jm {
                println("\t\t", jk, ": ", jv.(string))
            }
        }
    }
}

I apologise if this is poor in terms of Go best practices and such, I am new to the language. And I know that some elements of this aren't entirely necessary like the Message type definition but this works, at least on your data.