Parsing JSON da url in Rust con reqwest

Mattepuffo's logo
Parsing JSON da url in Rust con reqwest

Parsing JSON da url in Rust con reqwest

In questo articolo vediamo come eseguire il parsing di un JSON da url usando Rust.

Effettueremo una richiesta HTTP con reqwest, e faremo in parsing del JSON con serde.

Infine stamperemo in dati in formato tabella con prettytable-rs.

Sono tutte librerie che abbiamo visto, ma mai usate insieme.

Cominciamo con l'installazione delle varie dipendenze che ci servono; aggiungetele nel Cargo.toml:

[dependencies]
serde = { version = "1.0.150", features = ["derive"] }
serde_json = "1.0.89"
reqwest = { version = "0.11.13", features = ["json"] }
tokio = { version = "1.23.0", features = ["full"] }
prettytable-rs = "0.9.0"

A questo punto create un file Rust con dentro questo:

use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
pub struct Books {
    pub books: Vec<Book>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct Book {
    pub id:i32,
    pub title:String,
    pub author_id:i32,
    pub author:String,
    pub editor_id:i32,
    pub editor:String,
    pub price:f32,
    pub isbn:String,
    pub note:String,
    pub scaffale:i32,
    pub data_aggiunta:String,
}

In sostanza il JSON ha una ridice books che contiene i vari oggetti book; considerate che potete vedere la struttura del JSON direttamente da url visto che è pubblico (l'url lo trovate nel codice).

A questo punto nel main.rs:

pub mod book;

use book::{Books};
use reqwest::{Client, Error};
use prettytable::{Table, Row, Cell, Attr, color};

#[tokio::main]
async fn main() {
    get_books().await.unwrap();
}

async fn get_books() -> Result<(), Error> {
    let items: Books = Client::new()
        .get("https://www.mattepuffo.com/api/book/get.php")
        .send()
        .await?
        .json::<Books>()
        .await?;

    let mut table = Table::new();

    table.add_row(
        Row::new(vec![
            Cell::new("TITLE")
                .with_style(Attr::Bold)
                .with_style(Attr::ForegroundColor(color::YELLOW)),
            Cell::new("AUTHOR")
                .with_style(Attr::Bold)
                .with_style(Attr::ForegroundColor(color::GREEN)),
            Cell::new("EDITOR")
                .with_style(Attr::Bold)
                .with_style(Attr::ForegroundColor(color::GREEN)),
        ])
    );

    for book in items.books.iter() {
        table.add_row(
            Row::new(vec![
                Cell::new(book.title.as_str()),
                Cell::new(book.author.as_str()),
                Cell::new(book.editor.as_str()),
            ])
        );
    }

    table.printstd();

    Ok(())
}

Enjoy!


Condividi

Commentami!