仅将 JSON 文件中的第一项读入 Rust 变量

问题描述 投票:0回答:1

我有一个以下格式的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),
        }
    }
}
json rust filestream serde serde-json
1个回答
0
投票

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);
}

您当然可以反序列化为其他类型,例如时间对象而不是字符串。

© www.soinside.com 2019 - 2024. All rights reserved.