我有一个以下格式的json文件:
[
{
"end_date": "2024-02-20 16:31:12",
"instrument": "BTC-1MAR24-36000-C",
"start_date": "2024-02-12 00:00:02"
},
{
"end_date": "2024-02-20 16:31:12",
"instrument": "BTC-1MAR24-36000-P",
"start_date": "2024-02-12 00:00:04"
}
]
在我的 Rust 程序中,我只想处理该数组中的第一个对象。我在使用 serde_json::Deserializer 模块时遇到问题。每当我尝试仅处理第一个项目时,我最终都会读取整个项目数组。这里的假设是该文件可能非常大,所以我不想读取文件的全部内容,只想读取第一项。
以下是我尝试过的变体之一。有什么想法吗?谢谢!
fn main() {
let file = File::open("contract_start_end.json").expect("Failed to open file");
let reader = BufReader::new(file);
let mut deserializer = Deserializer::from_reader(reader).into_iter::<Value>();
if let Some(first_object) = deserializer.next() {
match first_object {
Ok(json) => println!("{:?}", json),
Err(e) => println!("Error parsing JSON: {}", e),
}
}
}
serde_json::Deserializer
旨在支持多个连续的 JSON 元素,而不是数组,数组是单个值。要反序列化它,请使用 from_reader()
。然后,检查生成的 serde_json::Value
并从中获取 Array
。
更好的设计是反序列化类型化值:
#[derive(serde::Deserialize)]
struct Element {
end_date: String,
instrument: String,
start_date: String,
}
fn main() {
let file = File::open("contract_start_end.json").expect("Failed to open file");
let reader = BufReader::new(file);
let mut array = serde_json::from_reader::<Vec<Element>>(reader);
}
您当然可以反序列化为其他类型,例如时间对象而不是字符串。