2017-05-16 2 views
-2

Wie kann ich dieses json Objekt analysieren:Parse dynamische json Objekt

{ 
    "ports": { 
     "0": { 
      "3306": "3306" 
     }, 
     "1": { 
      "3307": "9908" 
     } 
    } 
} 

kann ich N Ports, und die Werte für jeden Port wird immer ein Schlüssel sein: Wert-Paar.

Bisher habe ich das versucht:

type Ports struct { 
    Port map[string]string 
} 

Damit ich die Schlüssel zu bekommen (0, 1), aber die Werte leer sind.

Ich habe auch versucht dies:

type Ports struct { 
    Port map[string]struct{ 
     Values map[string]string 
    } 
} 

Aber die Arbeit auch nicht. Diese

ist, wie ich bin Decodierung des JSON-Objekt:

var requestBody Ports 
decoder := json.NewDecoder(body) 
err := decoder.Decode(&requestBody) 
+0

Achten Sie auf die Typen. Ist '{" 3306 ":" 3306 "}} eine Zeichenkette? Nein. Ist '{" 3306 ":" 3306 "}} ein Objekt mit einem Feld namens' Values'? Nein. – hobbs

Antwort

3

Verwenden Sie diesen Typ:

type Ports struct { 
    Ports map[string]map[string]string 
} 

playground example

Hinweise:

  • Die Feldnamen viel Spiel . Ich habe den Feldnamen "Ports" verwendet, um den Namen zu finden, der im JSON-Text verwendet wurde.
  • Die Go-Typen sollten dieselbe Verschachtelungsebene in JSON haben. Eine Struktur und Zuordnung jeder Zählung für eine Verschachtelungsebene. Der erste Versuch hat nicht genug Verschachtelung, der zweite Versuch hat eine zu viele Verschachtelungsebenen (die Struktur mit dem Feld Werte).
1

Sie können es wie folgt analysieren.

https://play.golang.org/p/09VDJidAVs

type Ports struct { 
    Ports map[string]*Port `json:"ports"` 
} 

type Port map[string]string 


func main() { 
    p := &Ports{} 
    err := json.Unmarshal([]byte(ports),p) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 

    // using 

    // if you need to sort by the number value, get the keys in a slice 
    keys := make([]string, 0, len(p.Ports)) 
    for k, _ := range p.Ports { 
     keys = append(keys, k) 
    } 
    // sort here 

    for i := range keys { 
     fmt.Printf("%+v\n",p.Ports[keys[i]]) 
    } 

    // if you don't care to sort 
    for _, v := range p.Ports { 
     for k, v := range *v { 
      fmt.Printf("%s: %s\n", k,v) 
     } 
    } 
}