golang json unmarshal part of map[string]interface{}

go, json

Solution

I would propose to construct a proper model for your data. This will enable you to cleanly unmarshal your data into a Go struct.

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)
}

Problem

I have the following code to try to Unmarshal this json file, however the line json.Unmarshal([]byte(msg["restaurant"]), &restaurant) always gives an error. How can I make Unmarshal ignore the "restaurant" or pass only the "restaurant" data to the Unmarshal function? Thanks! ``` { "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) ```

Original source