2014-04-23 1 views
6

Ho il seguente codice per provare a Unmarshal questo file json, tuttavia la riga json.Unmarshal ([] byte (msg ["ristorante"]), & ristorante) dà sempre un errore. Come posso far sì che Unmarshal ignori il "ristorante" o passi solo i dati del "ristorante" alla funzione Unmarshal?golan json unmarshal parte della mappa [stringa] interfaccia {}

Grazie!

{ 
    "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) 

risposta

8

Vorrei proporre di costruire un modello corretto per i dati. Ciò ti consentirà di pulire in modo pulito i tuoi dati in una struttura Go.

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 si verifica in modo ricorsivo, quindi msg["restaurant"] non è più una stringa JSON - è un altro map[string]interface{}. Se si desidera unmarshall direttamente in un oggetto Restaurant, sarà necessario fornire un oggetto wrapper semplice con un membro Restaurant e unmarshall in quello.

9

È possibile fare deserializzazione generico ala GSON decodificando in un'interfaccia e quindi estrarre una mappa di livello superiore dal risultato, ad esempio:

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

Vedere "decodifica dati arbitrari" in http://blog.golang.org/json-and-go per più dentro

+0

Buona risposta! A volte fare un modello per fare il rigoroso Unmarshalling è un dolore. – Civilian

Problemi correlati