簡體   English   中英

我如何懶惰地從Rust中的文件/流中讀取多個JSON值?

[英]How I can I lazily read multiple JSON values from a file/stream in Rust?

我想從Rust中的文件/閱讀器中讀取多個JSON對象,一次一個。 不幸的是, serde_json::from_reader(...)只讀到文件結尾; 似乎沒有任何方法可以使用它來讀取單個對象或懶惰地迭代對象。

有沒有辦法做到這一點? 使用serde_json是理想的,但是如果有一個不同的庫,我會願意使用它。

目前我將每個對象放在一個單獨的行上並單獨解析它們,但我真的不想這樣做。

示例使用

main.rs

use serde_json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
   let stdin = std::io::stdin();
   let stdin = stdin.lock();

   for item in serde_json::iter_from_reader(stdin) {
     println!("Got {:?}", item);
   }

   Ok(())
}

in.txt

{"foo": ["bar", "baz"]} 1 2 [] 4 5 6

示例會話

Got Object({"foo": Array([String("bar"), String("baz")])})
Got Number(1)
Got Number(2)
Got Array([])
Got Number(4)
Got Number(5)
Got Number(6)

我想用Python做這件事時,這很痛苦,但幸運的是,這是事實上標准的serde_json箱子的直接支持功能! 它不作為單個便捷函數公開,但我們只需要從我們的文件/閱讀器創建一個serde_json::Deserializer讀取,然后使用它的.into_iter()方法獲得一個StreamDeserializer迭代器,產生包含serde_json::Value Result JSON值。

use serde_json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
   let stdin = std::io::stdin();
   let stdin = stdin.lock();

   let deserializer = serde_json::Deserializer::from_reader(stdin);
   let iterator = deserializer.into_iter::<serde_json::Value>();
   for item in iterator {
     println!("Got {:?}", item?);
   }

   Ok(())
}

有一點需要注意:如果遇到語法錯誤,迭代器將開始產生無限的錯誤結果序列,永遠不會繼續前進。 您需要確保處理循環內部的錯誤,否則循環將永遠不會結束。 在上面的代碼片段中,我們通過使用? 問號運算符打破循環並從我們的函數返回第一個serde_json::Result::Err

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM