[英]How I can I lazily read multiple JSON values from a file/stream in Python?
[英]How I can I lazily read multiple JSON values from a file/stream in Rust?
我想從Rust中的文件/閱讀器中讀取多個JSON對象,一次一個。 不幸的是, serde_json::from_reader(...)
只讀到文件結尾; 似乎沒有任何方法可以使用它來讀取單個對象或懶惰地迭代對象。
有沒有辦法做到這一點? 使用serde_json
是理想的,但是如果有一個不同的庫,我會願意使用它。
目前我將每個對象放在一個單獨的行上並單獨解析它們,但我真的不想這樣做。
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(())
}
{"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.