两个Api调用,具有不同的JSON响应。如何将它们输入到不同的结构中,但重新排列它们在GOlang中几乎相同?

时间:2018-02-23 04:58:33

标签: json go struct

我的第一个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),所以我会在结构中声明它们,但那我如何更改字段标签的名称?

1 个答案:

答案 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对象缺少某些字段,则它们将保持为空(默认初始化)。