2014-04-25 98 views
1

例如:获取json动态密钥名称作为字符串?

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

的程序,我一直在努力使需求得到ID为一个字符串,然后再使用它来检查LastSeen的时间。 我试过使用simplejsonjsonq,但仍无法弄清楚如何做到这一点。

+0

你也许在寻找这样的事情? http://stackoverflow.com/questions/17452722/how-to-get-the-key-value-from-a-json-string-in-golang我创建了一个正确的答案:http:// play .golang.org/p/L9lUI3LP1I –

回答

2

您可以使用RawMessage,并使其更simpiler(play with it):

package main 

import (
    "encoding/json" 
    "fmt" 
) 

var data []byte = []byte(`{"id": {"123456789": {"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\n", msg) 

} 
1

查看JSON上的Golang博客文章here可以使用encoding/json软件包来完成。我创建了一个小程序,做法如下:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

var data []byte = []byte(`{"id": {"123456789": {"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)) 
      } 
     } 
    } 
} 

我道歉,如果这是穷人的围棋最佳实践,这样的术语,我是新来的语言。而且我知道一些这样的元素并不像消息类型定义那样是完全必要的,但它至少在你的数据上起作用。