我的第一个API返回:
{"symbol":"ARKBTC","bidPrice":"0.00037580","bidQty":"12.59000000","askPrice":"0.00037690","askQty":"328.94000000"}
我正在使用的代码是
type Tckrstr struct {
Symbol string `json:"symbol"`
data
}
type data struct {
BidPrice float64 `json:"bidPrice,string,omitempty"`
AskPrice float64 `json:"askPrice,string,omitempty"`
}
func BinTckr() []Tckrstr {
raw, err := http.Get("https://api.binance.com/api/v3/ticker/bookTicker")
data, _ := ioutil.ReadAll(raw.Body)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
var m []Tckrstr
_ = json.Unmarshal(data, &m)
return m
}
func main() {
bintckr := BinTckr()
//do something with bintckr
for _, p := range bintckr {
fmt.Println(p)
}
}
这给了我:
{ETHBTC {0.084704 0.084747}}
现在第二个API以不同的方式返回,我不知道如何重新排列它,所以我只得到我想要的字段,按照我想要的顺序,它们是可比较的。
第二个API返回:
{"BTC_BCN":{"id":7,"last":"0.00000052","lowestAsk":"0.00000052","highestBid":"0.00000051","percentChange":"0.00000000","baseVolume":"36.50980204","quoteVolume":"69581654.14097802","isFrozen":"0","high24hr":"0.00000054","low24hr":"0.00000051"}
正如您所看到的那样,第一个字段的名称是第一个api上的值,并且没有“符号”名称。那么如何将其改为符号值
以及我不想要很多字段,只是相同的2(highestBid和lowestAsk),所以我会在结构中声明它们,但那我如何更改字段标签的名称?
答案 0 :(得分:0)
您可以使用匿名结构并仅使用您需要的数据填充您的真实结构,例如:
type RealData struct {
SomeField int `json:"some_field"`
}
req := struct{DifferentField int `json:"different_field"`}{}
json.Unmarshal(data, &req)
r := RealData{req.DifferentField}
另一种方法是,正如Vardius建议的那样,您使用的每个API都有一个接口和两个不同的结构。
我能想象的第三个解决方案是一个更大的结构,它具有比实际需要更多的字段,并通过查看设置哪些字段来区分。如果您尝试解析的JSON对象缺少某些字段,则它们将保持为空(默认初始化)。