2017-09-01 1 views
2

ich ein Json wie dieses:Golang - Parsing unbekannt JSON aus der Datei und iterieren hinein

{ 
    "store_name": "Barry's Farmer's Market", 
    "foods": { 
     "apple": "5.91", 
     "peach": "1.84", 
     "carrot": "6.44", 
     "beans": "3.05", 
     "orange": "5.75", 
     "cucumber": "6.42" 
    }, 
    "store_location": "Corner of Elm Tree Hill and 158th Street" 
} 

und ich möchte es als eine unbekannte JSON parsen eine Karte mit [string] Schnittstelle {}:

Berücksichtigt man, dass "v" nicht zu string konvertiert und dass ich alle Werte in "foods" angeben möchte, können Sie mir helfen? Ich denke, dass ich etwas vermisse ...

Antwort

4

Wenn Sie the documentation for json.Unmarshal lesen, können Sie sehen, welche Arten es benutzt, und stützen Sie Ihren Code darauf; oder verwenden Sie fmt.Printf("%T",v), um zu sehen, welchen Typ es zur Laufzeit ist.

err = json.Unmarshal(f, &parsed) 
for k, v := range parsed["foods"].(map[string]interface{}) { 
    fmt.Println(k, v) 
} 

Arbeits Spielplatz Beispiel: https://play.golang.org/p/nczV5qA41h

+0

Schön und perfekt. Denkst du, dass die Verwendung des "reflect" -Pakets, um herauszufinden, ob ich eine Zeichenfolge oder eine Map [string] -Schnittstelle habe, eine gute Idee wäre? –

+0

Wenn Sie nicht wissen, wie die Struktur aussehen soll, würde ich mich zunächst für einen [type switch] (https://golang.org/ref/spec#Switch_statements) entscheiden, und wenn Sie mehr Flexibilität benötigen, dann greifen Sie zurück Betrachtung. Reflexion ist im Allgemeinen die schlechteste Option in den meisten Sprachen, einschließlich Go. – Adrian

+0

Ich denke, ich werde nur _string_ und _map [string] interface_ verwenden, so dass Typ Schalter sehr hilfreich ist. Vielen Dank. –

0

Sie könnten nur eine Struktur bilden, die eine map[string]string enthält und darüber iterieren. https://play.golang.org/p/IVlrTTcrVB

type Store struct { 
    Name  string   `json:"store_name"` 
    Foods map[string]string `json:"foods"` 
    Location string   `json:"store_location"` 
} 

func main() { 
    var store Store 
    data := []byte(jsonData) 
    err := json.Unmarshal(data, &store) 
    if err != nil { 
     panic(err) 
    } 
    for k, v := range store.Foods { 
     fmt.Println(k + string(v)) 
    } 
} 
+0

Danke für deine Antwort, aber ich wusste das, plus ich wollte mit "unbekannten" JSON-Dateien umgehen. –