3 回答
TA贡献1831条经验 获得超9个赞
response["organic_results"]对应于 JSON 数组“organic_results”,因此它不是 a map[string]interface{},而是 a []interface。有多个结果,而不是一个。
for _,item:=range respose["organic_results"].([]interface{}) {
fmt.Printf("%v", item.(map[string]interface{})["title"])
}
TA贡献1808条经验 获得超4个赞
正如您在 JSON 中看到的,organic_results的值是 JSON 数组,而不是对象;数组的每个元素都是一个对象。因此,您不能断言organic_results,map[string]interface{}因为正如错误所述,它不是地图,而是[]interface. 例如,您可以这样做:
result := fmt.Sprintf("%v", response["organic_results"].([]interface{})[0].(map[string]interface{})["title"])但是当然这只会让你得到第一个结果的标题,如果结果为空,它会崩溃。您必须将其视为“从响应中获取标题”而不是“处理返回的零个或多个结果” - 即您可能希望循环organic_results并对每个结果对象执行某些操作。
TA贡献1785条经验 获得超4个赞
有时,逆向工程也有效,尽管我定义的所有类型看起来都非常直观,但我也遇到了无法解组自定义 JSON 文件的问题。
type ResourceConfig struct {
ResourceType map[string]AlphabetType `json:"resourceType"`
RedisConfig RedisConfigT `json:"redisConfig"`
}
type AlphabetType struct {
XXX []string `json:"xxx"`
YYY []string `json:"yyy"`
}
type RedisConfigT struct {
Broker string `json:"broker"`
DB string `json:"db"`
}
json 看起来像这样:
{
"resourceType": [
{"/abcdefg": [{"xxx": ["/vrf", "/lsp", "/vpn"], "yyy": ["/fpc"]}]},
{"/vrf": [{"xxx": [""], "yyy": ["/abcdefg"]}]},
{"/lsp": [{"xxx": [""], "yyy": ["/abcdefg"]}]},
{"/vpn": [{"xxx": [""], "yyy": ["/abcdefg"]}]},
{"/fpc": [{"xxx": ["/abcdefg"], "yyy": [""]}]}
],
"redisConfig": {"broker": "localhost: 6379", "db": 0}
}
在执行 UnMarshall 时,它会抛出无法解析的错误。
所以我决定首先以编程方式将所需的地图编组为 json,然后打印出来。
{"resourceType":{"/fpc":{"XXX":["/abcdefg"],"YYY":[]},
"/abcdefg":{"XXX":["/vrf","/lsp","/vpn"],"YYY":["/fpc"]},
"/abc":{"XXX":[],"YYY":["/abcdefg"]},
"/vpn":{"XXX":[],"YYY":["/abcdefg"]},
"/vrf":{"XXX":[],"YYY":["/abcdefg"]}},
"redisConfig":{"broker":"localhost:6349","db":"0"}}
现在在 json 文件中使用相同的格式并对其进行 UnMarshal 处理。它将很好地适合您根据最初生成 Json 所定义的类型。
- 3 回答
- 0 关注
- 1542 浏览
添加回答
举报
