Как я могу получить данные JSON API из ответа Reqwest?

Я хочу получить данные из API:

extern crate reqwest;

use std::io::Read;

pub fn main() {
    let mut response = reqwest::get("https://api.fcoin.com/v2/market/ticker/ftbtc")
        .expect("Failed to send request");
    let mut buf = String::new();
    response
        .read_to_string(&mut buf)
        .expect("Failed to read response");
    println!("{}", buf);
}

Выход

{"Статус": 0, "данные":{"тикер": [0.000061730,500.000000000,0.000061730,44411.280000000,0.000061740,917.980000000,0.000080330,0.000086540,0.000060260,7144217252.900000000,554239.734632892500000000], "тип": "ticker.ftbtc","след":2995173}}

Могу ли я передать buf или ответ в ключе => значение стиля Vec или массив?

1 ответ

Поскольку ваш API, похоже, использует JSON, вы можете использовать serde_json, это ящик, который позволяет вам анализировать JSON.

extern crate serde_json; // 1.0.21

use serde_json::{Value, Error};

#[macro_use]
extern crate serde_derive;

#[derive(Serialize, Deserialize)]
struct Foo {
    status: u8,
    data: Data,
}

#[derive(Serialize, Deserialize)]
struct Data {
    ticker: Vec<f64>,
    #[serde(rename = "type")]
    bar: String,
    seq: usize,
}

fn main() -> Result<(), Error> {
    let buf = r#"
                    {
                      "status": 0,
                      "data": {
                        "ticker": [
                          0.000068,
                          2360.41,
                          0.00006801,
                          30445.92,
                          0.00006889,
                          1016.86,
                          0.00008143,
                          0.00008654,
                          0.00006026,
                          7150041272.95,
                          554611.3932127054
                        ],
                        "type": "ticker.ftbtc",
                        "seq": 3001635
                      }
                    }"#;

    // You could just parse it to Value this is the "quick and dirty way"
    let v: Value = serde_json::from_str(buf)?;

    println!("{}", v["data"]["ticker"][0]);

    // Or you could use a struct to have a strong verification of the data
    let foo : Foo = serde_json::from_value(v)?;
    // let foo : Foo = serde_json::from_str(buf)?;

    println!("{}", foo.data.ticker[0]);

    Ok(())
}
Другие вопросы по тегам