GoLang JSON解码

时间:2017-11-07 22:05:53

标签: json go

请在标记之前阅读该问题。

  {
      "out_key": {
      "some_uri": "url",
      "more_than_one_key_here": {
           "Ip": "127.0.0.1",
           "port": "80",
       }
    }
  }

out_key是动态创建的。没有猜测它的名字。 同样,more_than_one_key_here也是动态创建的。 some_uri下的out_key将保持不变。在这种情况下,如何创建用于解码JSON的结构?

2 个答案:

答案 0 :(得分:2)

在Go字段中,必须在编译时知道结构的名称。因此,在您的情况下,结构类型是不合适的。或者,您可以使用地图。

让我们说,您只对IP和端口值感兴趣。然后你可以完全忽略JSON对象的键。

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

const data = `{
    "out_key": {
        "some_uri": "url",
        "more_than_one_key_here": {
            "Ip": "127.0.0.1",
            "port": "80"
        }
    }
}`

func main() {
    m := make(map[string]map[string]interface{})
    err := json.Unmarshal([]byte(data), &m)
    if err != nil {
        log.Fatalf("failed to parse JSON: %v", err)
    }

    for _, value := range m {
        for _, value := range value {
            m, ok := value.(map[string]interface{})
            if ok {
                fmt.Printf("IP: %s\n", m["Ip"])
                fmt.Printf("Port: %s\n", m["port"])
            }
        }
    }
}

答案 1 :(得分:-3)

您可以为Ip和Port创建一个结构,为其中一个键创建一个单独的结构。

type data struct{
    Ip   string
    port string
}

type DynamicKey map[string]data

然后,一旦你解码了json并拥有了动态密钥,比如说(rando_key)你可以这样做

fmt.Println(DynamicKey[rando_key].Ip, DynamicKey[rando_key].port) 

这仅适用于其中一个键,但可以重复此过程。