2017-08-02 4 views
0

Wie kann ich ein komplexes JSON-Objekt in eine Karte mit allen richtigen Typen in Golang konvertieren. Muss ich unbedingt die typische Golang-Sache machen, wo ich eine Struktur mit den Feldern, von denen ich weiß, dass sie vorhanden sind, oder gibt es eine generalisierte Art und Weise, die Felder in den richtigen Typen zu bekommen? HierKonvertieren von komplexen JSON zu Karte in Golang

ist ein Beispiel für eine JSON, die ich in eine Karte aktivieren möchten:

{ 
    "people": [ 
     { 
      "diffs": [ 
       77 
      ], 
      "original": { 
       "name": "Nick", 
       "active": "Active", 
       "email": "[email protected]" 
      }, 
      "id": "21" 
     } 
    ] 
} 
+0

Willkommen zu einer statisch typisierten Sprache. Mit dem 'json'-Paket können Sie immer Unmarshal in ein' map [string] Interface {} 'umwandeln, aber das ist normalerweise nicht das, was Sie wirklich wollen. – RayfenWindspear

Antwort

1

Sie könnten eine rekursive Funktion mit einem Switch-Typ Behauptung bauen, um die JSON-Array in eine mehrdimensionale Karte Typ behaupten oder eine abgeflachte Karte. Leider wird Ihre multidimensionale Karte sehr schnell kompliziert.

Was ich meine ist, Sie müssen oft mindestens ein paar Dimensionen zuordnen (zum Beispiel: map [string] map [string] map [string] string), wenn Sie ein verschachteltes JSON-Array haben wie " Menschen "oben.

Wenn Sie versucht haben, ein verschachteltes JSON-Array zu glätten, würden sich Ihre Schlüssel überlappen (d. H. Sie können den "name" -Schlüssel nur einmal verwenden). Sie könnten die Schlüssel markieren - so etwas wie "name_1": "Nick", aber diese Lösung funktioniert möglicherweise nicht für Ihren Anwendungsfall.

Wenn Sie die mehrdimensionale Weg gehen wollen, kann dieses Paket auch für Ihre Bedürfnisse arbeiten: http://github.com/Jeffail/gabs

Ich gebe Ihnen ein maßgeschneidertes Beispiel, und dann zwei Beispiele aus dem Link zu gabs der Github Seite :

package main 

import (
    "fmt" 
    "github.com/Jeffail/gabs" 
) 

func main() { 

    jsonS := `{ 
     "people": [ 
      { 
       "diffs": [ 
        77 
       ], 
       "original": { 
        "name": "Nick", 
        "active": "Active", 
        "email": "[email protected]" 
       }, 
       "id": "21" 
      } 
     ] 
    }` 

    gabsCon, err := gabs.ParseJSON([]byte(jsonS)) 

    if err != nil { 
     fmt.Println("gabs ParseJSON failed") 
    } 

    n1, ok := gabsCon.Path("people.original.name").Data().(string) 

    if !ok { 
     fmt.Println("gabs path failed") 
    } 

    fmt.Println(n1) 
} 

Hier ist ein nicht-zugeschnittene Beispiel, das gedruckt werden soll - erste, dritte, zweite):

jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ "first", "second", "third" ]}`)) 

// S is shorthand for Search 
children, _ := jsonParsed.S("array").Children() 
for _, child := range children { 
    fmt.Println(child.Data().(string)) 
} 

Und ein anderes Beispiel, das drucken würde - 1, 2, 3:

jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ {"value":1}, {"value":2}, {"value":3} ]}`)) 

fmt.Println(jsonParsed.Path("array.value").String()) 
Verwandte Themen