2014-04-25 138 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)) 
      } 
     } 
    } 
} 

我道歉,如果這是窮人的圍棋最佳實踐,這樣的術語,我是新來的語言。而且我知道一些這樣的元素並不像消息類型定義那樣是完全必要的,但它至少在你的數據上起作用。