Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
golang json解组映射[string]接口{}的一部分_Json_Go - Fatal编程技术网

golang json解组映射[string]接口{}的一部分

golang json解组映射[string]接口{}的一部分,json,go,Json,Go,我有下面的代码来尝试解组这个json文件,但是行json.Unmarshal([]字节(msg[“restaurant”]),&restaurant)总是给出一个错误。如何使解组器忽略“餐厅”或仅将“餐厅”数据传递给解组器函数 谢谢 { "restaurant": { "name": "Tickets", "owner": { "name": "Ferran" } } } file, e := ioutil.ReadFile("./rest

我有下面的代码来尝试解组这个json文件,但是行json.Unmarshal([]字节(msg[“restaurant”]),&restaurant)总是给出一个错误。如何使解组器忽略“餐厅”或仅将“餐厅”数据传递给解组器函数

谢谢

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

解组是递归发生的,因此
msg[“restaurant”]
不再是json字符串-它是另一个
map[string]接口{}
。如果您想直接解组到一个
餐厅
对象中,您必须提供一个带有
餐厅
成员的简单包装器对象,并将其解组到该对象中。

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

通过解码到接口中,然后从结果中提取顶级映射,可以对ala gson进行通用解组,例如:

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

有关详细信息,请参阅中的“解码任意数据”。

回答得好!有时制作一个模型来进行严格的解组是一件痛苦的事情。