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

时间:2014-04-23 15:51:40

标签: json go

我有以下代码尝试解组这个json文件,但是行json.Unmarshal([] byte(msg [" restaurant"])和& restaurant)总是会出错。我如何让Unmarshal忽略"餐厅"或只通过"餐厅"数据到Unmarshal函数?

谢谢!

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

3 个答案:

答案 0 :(得分:17)

可以通过解码到接口然后从结果中提取顶级地图来执行通用解组ala gson,例如:

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

请参阅http://blog.golang.org/json-and-go中的“解码任意数据”以获取更多信息。

答案 1 :(得分:9)

我建议为您的数据构建一个合适的模型。这将使您能够将数据干净地解组为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)
}

答案 2 :(得分:2)

解组以递归方式发生,因此msg["restaurant"]不再是json字符串 - 它是另一个map[string]interface{}。如果要直接解组成Restaurant对象,则必须提供一个带有Restaurant成员的简单包装器对象,并将其解组。