pub fn from_reader<R, T>(reader: R) -> Result<T>where
R: Read,
T: for<'de> NsonDeserialize<'de>,Expand description
Deserialize from a std::io::Read (requires the std feature).
The input is pulled incrementally (see StreamDecoder), so decoding
starts before the whole payload has arrived. The target type must be
deserializable for any lifetime (owned): borrowed inputs (&str, &[u8],
nextjson::Bytes) cannot come from a stream.
Examples found in repository?
examples/streaming_reader.rs (line 63)
39fn main() -> nextjson::Result<()> {
40 let messages = vec![
41 Message {
42 id: 1,
43 body: "first message".into(),
44 },
45 Message {
46 id: 2,
47 body: "second message".into(),
48 },
49 Message {
50 id: 3,
51 body: "third message".into(),
52 },
53 ];
54
55 // 1. 顶层入口:把一条 JSON 载荷放进 Cursor,再包一层慢速读取器。
56 let payload = nextjson::to_vec(&messages)?;
57 println!("序列化载荷: {} 字节", payload.len());
58
59 let slow = ChunkedReader {
60 inner: Cursor::new(payload.clone()),
61 chunk: 3,
62 };
63 let decoded: Vec<Message> = from_reader(slow)?;
64 assert_eq!(decoded, messages);
65 println!(
66 "from_reader + 3 字节/次: 解码 {} 条消息,与源数据一致",
67 decoded.len()
68 );
69
70 // 2. 手动控制:StreamDecoder 边到边读取单条消息。
71 let single = Message {
72 id: 42,
73 body: "streamed".into(),
74 };
75 let one_payload = nextjson::to_vec(&single)?;
76 let slow_one = ChunkedReader {
77 inner: Cursor::new(one_payload),
78 chunk: 2,
79 };
80
81 let mut decoder = StreamDecoder::new(slow_one);
82 let value: Message = Message::nextdecode(&mut decoder)?;
83 decoder.end()?;
84 assert_eq!(value, single);
85 println!("StreamDecoder + 2 字节/次: 解码 msg id = {}", value.id);
86
87 // 3. 流式容器:数组到达时逐条解码(消息没有一次性到齐也没关系)。
88 let mut full = Cursor::new(nextjson::to_vec(&messages)?);
89 let mut d = StreamDecoder::new(&mut full);
90 let streamed: Vec<Message> = Vec::<Message>::nextdecode(&mut d)?;
91 d.end()?;
92 assert_eq!(streamed, messages);
93 println!(
94 "流式解码整个数组: {} 条消息,首条 id = {}",
95 streamed.len(),
96 streamed[0].id
97 );
98
99 Ok(())
100}