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!
rust json reqwest tokio serde
Commentami!