#rust #rust-rocket
#Ржавчина #rust-ракета
Вопрос:
Все еще новичок в Rust, пытаюсь понять, как извлечь title
из a JournalArticle
с помощью ящика Zotero.
Я получил это и могу подтвердить, что элемент успешно извлечен:
let zc = ZoteroCredentials::new();
let z = ZoteroInit::set_user(amp;zc.api_id, amp;zc.api_key);
let item = z.get_item(item_id, None).unwrap();
Отсюда я вижу, что an item.data
— это an ItemType
, в частности, JournalArticleData . Но я принципиально не совсем понимаю, как либо а) сериализовать это в JSON, либо б) получить доступ .title
как свойство.
Для контекста это будет результатом маршрута ракеты GET
.
Любая помощь была бы очень признательна!
Ответ №1:
Похоже, что часть, которую вы упускаете, заключается в том, как использовать сопоставление с образцом для перечисления. Я не знаком с zotero
so, все это основано на документах, с подробными аннотациями типа, в которых четко указано, что я думаю, что я делаю:
use zotero::data_structure::item::{Item, ItemType, JournalArticleData};
let item: Item = z.get_item(item_id, None).unwrap();
// Now we must extract the JournalArticle from the ItemType, which is an enum
// and therefore requires pattern matching.
let article: JournalArticleData = match item.data {
ItemType::JournalArticle(a) => a,
something_else => todo!("handle wrong type of item"),
}
let title: String = article.title;
(Также match
может быть записан if let
как an).
Вы также можете использовать сопоставление с образцом для просмотра всей структуры, а не только перечисления, которое требует этого:
match z.get_item(item_id, None).unwrap() {
Item {
data: ItemType::JournalArticle(JournalArticleData {
title,
..
}),
..
} => {
// Use the `title` variable here
},
something_else => todo!("handle wrong type of item"),
}
Комментарии:
1. Большое спасибо! Оцените объяснение и предложения по более глубокому сопоставлению с образцом. Похоже, что
JournalArticleData
структура имеет aVec<Creator>
при синтаксическом анализе JSON из API, что может привести к сбою, если они неfirstName
включены. Но это проблема для другого дня! Еще раз спасибо.