2016-06-13 11 views
1

I dynamische/random JSON Antworten in GO, mit verschachtelten DatenGo Lang Hilfe - Zugriff auf Array/Scheibe Schnittstellen

body, _ := ioutil.ReadAll(response.Body) 
    resp := make(map[string]interface{}) 
    err = json.Unmarshal(body, &resp) 

    fmt.Printf("BODY: %T<\n", body) 
    fmt.Printf("BODY: %s<\n", body) 
    fmt.Printf("RESP: %s<\n", resp) 
    fmt.Printf("RESP: %T<\n", resp) 
    fmt.Printf("RESP[results]: %T<\n", resp["results"]) 
    fmt.Printf("RESP[results]: %s<\n", resp["results"]) 

Körper ist das JSON resultiert aus dem HTTP-Server zu entschlüsseln bin versucht, und ich entordnen es und das Ergebnis scheint ein Stück von Bytes zu sein.

KÖRPER: [] uint8

BODY: { "Ergebnisse": [{ "Code": 500.0 "Fehler": "Konfigurationsdatei 'c2-web-2.conf' existiert bereits" [] , "status": "Objekt konnte nicht erstellt werden."}]}

Also entmare ich es in resp und das funktioniert wie erwartet.

RESP: map [string] Schnittstelle {}

RESP: Karte [Ergebnisse: [Karte [code:% s (float64 = 500) Fehler: [Konfigurationsdatei 'c2-web-2.conf' existiert bereits.] status: Objekt konnte nicht erstellt werden.]]] <

Ich kann mit den wichtigsten Ergebnissen auf die Karte zugreifen.

RESP [Ergebnisse]: [] {} Schnittstelle

RESP [Ergebnisse]: [Karte [code:% s (float64 = 500) Fehler: [Konfigurationsdatei ‚conf.d/hosts/C2- web-2.conf 'existiert bereits.] status: Objekt konnte nicht erstellt werden.]] <

Nun, was ich will, ist es die "Code", "Fehler" und "Status", die in resp [" Ergebnisse "] Dies sieht aus wie ein Array oder Slice und ich habe versucht, es indizieren, aber ich bekomme den Fehler zur Kompilierzeit

./create_host.go:62: ungültiger Vorgang: resp [" Ergebnisse "] [0] (Typschnittstelle {} unterstützt keine Indizierung)

Ich habe viel gegoogelt, habe versucht, die Daten innerhalb von resp [results] usw. zu entpacken, aber nach ein paar Tagen habe ich keine großen Fortschritte gemacht.

Wie soll ich auf die Karte zugreifen, die ein Mitglied eines Arrays zu sein scheint? Die Datenstruktur ist nicht garantiert, daher kann ich keine Struktur erstellen und bin nicht darauf eingehen.

Dank

Antwort

0

Ich glaube, Sie eine Art Behauptung tun müssen. Sie haben eine interface{}, aber Sie brauchen eine Art von Scheibe zum Indexieren. Versuchen Sie resp["results"].([]interface{})[0]? (Sorry, ich hatte keine Gelegenheit, das selbst zu testen.)

1

Ein Mitarbeiter stellte die Code-Abfrage zur Verfügung, die es mir ermöglichte, auf die Karteneinträge zuzugreifen, die ich suchte.

respBody, _ := ioutil.ReadAll(response.Body) 

    var rsp interface{} 
    if err := json.Unmarshal(respBody, &rsp); err != nil { 
      log.Fatal(err) 
    } 
    resultMap := rsp.(map[string]interface{})["results"].([]interface{})[0].(map[string]interface{}) 
    fmt.Printf("test: %s<\n", resultMap["errors"]) 

Test: [. Konfigurationsdatei 'c2-web-2.conf' existiert bereits] <