将json动态密钥名称作为字符串?

时间:2014-04-25 10:33:09

标签: json go

例如:

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

我一直试图制作的程序需要将id作为字符串获取,然后用它来检查LastSeen中的时间。 我尝试过使用simplejsonjsonq,但仍然无法弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:3)

您可以使用RawMessage并使其更简单(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\n", msg)

}

答案 1 :(得分:1)

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

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))
            }
        }
    }
}

如果Go的最佳实践方面很差,我很抱歉,我是该语言的新手。我知道这些内容的某些元素并不像Message类型定义那样完全必要,但这至少对您的数据有用。