0

我是 rust 新手,正在开发与 Binance API 交互的工具。API 返回如下响应:

{
  "lastUpdateId": 1027024,
  "bids": [
    [
      "4.00000000",     // PRICE
      "431.00000000"    // QTY
    ]
  ],
  "asks": [
    [
      "4.00000200",
      "12.00000000"
    ]
  ]
}

Bids 和 Asks 是一组数组。我必须struct为 API 响应声明。

我目前有

use reqwest::Error;
use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct Depth {
    lastUpdateId: u32,
    bids: Vec<u64>,
    asks: Vec<u64>,
}

#[tokio::main]
pub async fn order_book() -> Result<(), Error> {
    let request_url = format!("https://api.binance.us/api/v3/depth?symbol=BTCUSD");
    println!("{}", request_url);
    let response = reqwest::get(&request_url).await?;
    println!("Status: {}", response.status());

    let depth: Depth = response.json().await?;
    println!("{:?}", depth);

    Ok(())
}

我相信我正在声明出价类型并错误地询问,但我无法确定如何声明数组数组。我得到一个 200 的 response.status,但我无法打印出response.json.

谢谢你!

4

1 回答 1

1

由于它返回一个数组数组,因此您需要嵌套类型。bids: Vec<Vec<u64>>应该可以工作,但是由于您知道每个内部数组将有两个元素,因此您可以使用bids: Vec<[u64; 2]>- 固定大小数组bids: Vec<(u64, u64)>的动态大小的向量,或动态大小的元组向量来提高效率。您还需要asks类似地更新。

您的最终代码可能如下所示:

use reqwest::Error;
use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct Depth {
    lastUpdateId: u32,
    bids: Vec<(u64, u64)>,
    asks: Vec<(u64, u64)>,
}

#[tokio::main]
pub async fn order_book() -> Result<(), Error> {
    let request_url = format!("https://api.binance.us/api/v3/depth?symbol=BTCUSD");
    println!("{}", request_url);
    let response = reqwest::get(&request_url).await?;
    println!("Status: {}", response.status());

    let depth: Depth = response.json().await?;
    println!("{:?}", depth);

    Ok(())
}
于 2021-06-04T02:06:56.200 回答