我第一次涉足 GO,我用来获取股票价格的 API 接受多个股票代码(认为股票 ID;NVDA => Nvidia)以减少我有限的 API 调用。 然而,当尝试获取多个股票时,正文似乎被切断了:
{
"meta ": {
"requested ": 2,
"returned ": 2
},
"data ": [
{
"ticker ": "MSFT ",
"name ": "Microsoft Corporation ",
"exchange_short ": null,
"exchange_long ": null,
"mic_code ": "IEXG ",
"currency ": "USD ",
"price ": 374.72,
"day_high ": 376.92,
"day_low ": 373.54,
"day_open ": 374.94,
"52_week_high ": 349.84,
"52_week_low ": 213.43,
"market_cap ": null,
"previous_close_price ": 374.58,
"previous_close_price_time ": "2023-12-22T15:59:56.000000 ",
"day_change ": 0.04,
"volume ": 165558,
"is_extended_hours_price ": false,
"last_trade_time ": "2023-12-26T16:00:00.000000 "
},
{
"ticker ": ""
在邮递员中直接对 Stock API 进行精确调用会返回:
{
"meta": {
"requested": 2,
"returned": 2
},
"data": [
{
"ticker": "MSFT",
"name": "Microsoft Corporation",
"exchange_short": null,
"exchange_long": null,
"mic_code": "IEXG",
"currency": "USD",
"price": 374.72,
"day_high": 376.92,
"day_low": 373.54,
"day_open": 374.94,
"52_week_high": 349.84,
"52_week_low": 213.43,
"market_cap": null,
"previous_close_price": 374.58,
"previous_close_price_time": "2023-12-22T15:59:56.000000",
"day_change": 0.04,
"volume": 165558,
"is_extended_hours_price": false,
"last_trade_time": "2023-12-26T16:00:00.000000"
},
{
"ticker": "PLTR",
"name": "Palantir Technologies Inc",
"exchange_short": null,
"exchange_long": null,
"mic_code": "IEXG",
"currency": "USD",
"price": 17.68,
"day_high": 17.75,
"day_low": 17.34,
"day_open": 17.45,
"52_week_high": 17.16,
"52_week_low": 5.92,
"market_cap": null,
"previous_close_price": 17.42,
"previous_close_price_time": "2023-12-22T15:59:56.000000",
"day_change": 1.47,
"volume": 236201,
"is_extended_hours_price": false,
"last_trade_time": "2023-12-26T15:59:58.000000"
}
]
}
我认为我做错了什么(昨天之前我从未接触过 GO) 这是相关代码:
func getStockPriceData(ticker string) []Stock {
baseURL, _ := url.Parse("https://api.stockdata.org")
baseURL.Path += "v1/data/quote"
params := url.Values{}
params.Add("symbols", ticker)
params.Add("api_token", apiToken.ApiToken)
baseURL.RawQuery = params.Encode()
req, _ := http.NewRequest("GET", baseURL.String(), nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
panic(err.Error())
}
apiResponseData := ApiResponseStockData{}
//json.NewDecoder(res.Body).Decode(&apiResponseData)
err2 := json.Unmarshal(body, &apiResponseData)
if err2 != nil {
fmt.Println("whoops:", err2)
}
stocks := []Stock{}
for _, data := range apiResponseData.ResponseStockData {
stock := Stock{}
stock.Name = data.Name
stock.Ticker = data.Ticker
stock.Price = data.Price
stock.DayHigh = data.DayHigh
stock.DayLow = data.DayLow
stock.DayOpen = data.DayOpen
stock.PreviousClosePrice = data.PreviousClosePrice
stock.DayChange = data.DayChange
stocks = append(stocks, stock)
}
return stocks
}
上下文结构:
type Stock struct {
Name string `json:"name"`
Ticker string `json:"ticker"`
Price float64 `json:"price"`
DayHigh float64 `json:"day_high"`
DayLow float64 `json:"day_low"`
DayOpen float64 `json:"day_open"`
DayChange float64 `json:"day_change"`
PreviousClosePrice float64 `json:"previous_close_price"`
}
type ApiResponseStockData struct {
ResponseStockData []ResponseData `json:"data"`
}
type ResponseData struct {
Name string `json:"name"`
Ticker string `json:"ticker"`
ExchangeShort bool `json:"exchange_short"`
ExchangeLong bool `json:"exchange_long"`
MicCode string `json:"mic_code"`
Currency string `json:"currency"`
Price float64 `json:"price"`
DayHigh float64 `json:"day_high"`
DayLow float64 `json:"day_low"`
DayOpen float64 `json:"day_open"`
DayChange float64 `json:"day_change"`
YearHigh float64 `json:"52_week_high"`
YearLow float64 `json:"52_week_low"`
MarketCap float64 `json:"market_cap"`
PreviousClosePrice float64 `json:"previous_close_price"`
PreviousCloseTime time.Time `json:"previous_close_time"`
Volume float64 `json:"volume"`
IsExtendedHoursPrice bool `json:"is_extended_hours_price"`
LastTradeTime time.Time `json:"last_trade_time"`
}
在查看了一些线程后,我尝试同时使用
json.Unmarshal
和 json.NewDecoder().Decode()
但仍然没有运气。上面的截止字符串来自主体,当使用 Decode
或 Unmarshal
时,它成功地将单个完整对象添加到 apiResponseData
。我可以理解这是否是一个巨大的回应,但这看起来很简单,所以我不得不假设我犯了一个非常明显的菜鸟错误。
任何帮助将不胜感激。
您正在尝试使用包含时区偏移量(“Z07:00”)的格式解析时间字符串。
您需要将时间布局调整为以下。
layout := "2006-01-02T15:04:05.000000"
您的错误处理不正确,这就是为什么您也能够以正确的响应退出。