如何使用Rust的Zotero crate提取JournalArticle条目的title属性
依赖配置
首先确认你的Cargo.toml已经引入了所需依赖:
[dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" rocket = { version = "0.5", features = ["json"] } zotero = "对应可用版本号"
需求b:直接访问.title属性
ItemType是枚举类型,需要通过模式匹配提取出JournalArticle变体包裹的JournalArticleData结构体实例,即可直接访问字段:
use zotero::data_structure::item::ItemType; // 匹配提取期刊文章数据 let article_title = match item.data { ItemType::JournalArticle(article_data) => { // 直接访问title字段 article_data.title } // 处理非期刊文章的情况,可根据业务需求调整返回逻辑 _ => String::from("非期刊文章类型") };
如果需要保留item的所有权不被转移,可以在匹配时使用ref关键字借用数据:
let article_title = match item.data { ItemType::JournalArticle(ref article_data) => &article_data.title, _ => "" };
需求a:序列化为JSON
JournalArticleData结构体默认已经实现了serde的序列化特征,直接调用serde_json相关方法即可:
use serde_json::to_string; let article_json = match item.data { ItemType::JournalArticle(article_data) => { to_string(&article_data).expect("序列化失败") } _ => String::from("{}") };
适配Rocket路由返回
不需要手动序列化JSON字符串,直接用Rocket提供的Json包装器即可自动完成序列化和响应头设置:
use rocket::serde::json::Json; use zotero::data_structure::item::{ItemType, JournalArticleData}; #[get("/journal-article/<item_id>")] async fn get_journal_article(item_id: String) -> Option<Json<JournalArticleData>> { let zc = ZoteroCredentials::new(); let z = ZoteroInit::set_user(&zc.api_id, &zc.api_key); let item = z.get_item(item_id, None).unwrap(); match item.data { ItemType::JournalArticle(article_data) => Some(Json(article_data)), _ => None // 非期刊文章返回404,也可自定义错误响应类型 } }
内容的提问来源于stack exchange,提问作者ghukill
相关产品推荐
相关产品推荐

