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 關注
- 1460 瀏覽
添加回答
舉報