2014-04-23 9 views
6

Ich habe den folgenden Code zu versuchen, diese json-Datei zu Unmarshal, jedoch die Zeile json.Unmarshal ([] Byte (msg ["Restaurant"]), & Restaurant) gibt immer einen Fehler. Wie kann ich Unmarshal dazu bringen, das "Restaurant" zu ignorieren oder nur die "Restaurant" -Daten an die Unmarshal-Funktion zu übergeben?golang json unmarshal Teil der Karte [string] Schnittstelle {}

Danke!

{ 
    "restaurant": { 
    "name": "Tickets", 
    "owner": { 
     "name": "Ferran" 
    } 
    } 
} 


    file, e := ioutil.ReadFile("./rest_read.json") 
    if e != nil { 
      fmt.Println("file error") 
      os.Exit(1) 
    } 

    var data interface{} 
    json.Unmarshal(file, &data) 

    msg := data.(map[string]interface{}) 
    log.Println(msg) 
    log.Println(msg["restaurant"]) 
    log.Println(reflect.TypeOf(msg["restaurant"])) 

    var restaurant Restaurant 
    json.Unmarshal([]byte(msg["restaurant"]), &restaurant) 

    log.Println("RName: ", restaurant.Name) 
    log.Println("Name: ", restaurant.Owner.Name) 

Antwort

8

Ich würde vorschlagen, ein geeignetes Modell für Ihre Daten zu erstellen. Dadurch können Sie Ihre Daten sauber in eine Go-Struktur entpacken.

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Restaurant struct { 
    Restaurant RestaurantData `json:"restaurant"` 
} 

type RestaurantData struct { 
    Name string `json:"name"` 
    Owner Owner `json:"owner"` 
} 

type Owner struct { 
    Name string `json:"name"` 
} 

func main() { 
    data := `{"restaurant":{"name":"Tickets","owner":{"name":"Ferran"}}}` 
    r := Restaurant{} 
    json.Unmarshal([]byte(data), &r) 

    fmt.Printf("%+v", r) 
} 
1

Unmarshalling tritt rekursiv, so msg["restaurant"] ist nicht länger ein json string - es andere map[string]interface{} ist. Wenn Sie direkt in ein Restaurant-Objekt entpacken möchten, müssen Sie ein einfaches Wrapper-Objekt mit einem Restaurant-Member bereitstellen und in diesen Bereich migrieren.

9

Es ist möglich, durch Dekodierung in eine Schnittstelle generic unmarshalling ala Gson zu tun und dann eine Top-Level-Karte aus dem Ergebnis zu extrahieren, zB:

var msgMapTemplate interface{} 
err := json.Unmarshal([]byte(t.ResponseBody), &msgMapTemplate) 
t.AssertEqual(err, nil) 
msgMap := msgMapTemplate.(map[string]interface{}) 

Siehe „beliebige Daten Dekodierung“ in http://blog.golang.org/json-and-go für mehr hinein.

+0

Gute Antwort! Manchmal ist es ein Schmerz, ein Modell zu machen, um strenges Unmarshalling zu machen. – Civilian

Verwandte Themen