2017-11-07 12 views
-3

問題を報告する前に必ずお読みください。GoLang JSONデコード

{ 
     "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をデコードするための構造体を作成するにはどうすればよいですか?

+3

なぜ構造体の代わりにマップを使用しないのですか? – JimB

+0

私はmorekey map [string] struct_for_ip_port型を割り当てて、 "some_url"と "morekey"構造体の両方を取った別の構造体を作成しようとしました。それは動作していないようです。 "morekey"は "morekey"を実際のキー名に置き換えるのではなく、 "morekey"で参照する必要があります。それは望ましくない。 – rickydj

+2

あなたはあなたが探しているものの例を表示できますか?ダイナミックキーが必要な場合はマップを使用する必要があります。マップで十分でない場合は、わたしはそれが何であるかを理解していません。 – JimB

答えて

-3

IpとPortの構造体と、キーの1つのための構造体を作成することができます。

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) 

を行うことができますこれが唯一のキーのためのコースオフですが、処理を繰り返すことができます。

2

構造体のGoフィールド名は、コンパイル時に知っておく必要があります。したがって、あなたの場合、struct型は適切ではありません。また、マップを使用することもできます。

ここで、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"]) 
      } 
     } 
    } 
}