Rust 命中了一个 API 那 returns 一个数组数组

Rust hit an API that returns an array of arrays

我是 Rust 的新手,正在研究与 Binance 交互的工具 API。 API returns 响应如下:

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

买价和卖价是一组数组。我必须为 API 响应声明 struct

我目前有

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

谢谢!

因为它returns一个数组的数组,你需要嵌套类型。 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(())
}