@@ -155,6 +155,19 @@ impl<'de, R: Read<'de>> Deserializer<R> {
155
155
}
156
156
}
157
157
158
+ /// Parse the JSON array as an iterator over values of type T.
159
+ pub fn into_array_iter < T > ( self ) -> ArrayDeserializer < ' de , R , T >
160
+ where
161
+ T : de:: Deserialize < ' de > ,
162
+ {
163
+ ArrayDeserializer {
164
+ de : self ,
165
+ started : false ,
166
+ output : PhantomData ,
167
+ lifetime : PhantomData ,
168
+ }
169
+ }
170
+
158
171
/// Parse arbitrarily deep JSON structures without any consideration for
159
172
/// overflowing the stack.
160
173
///
@@ -2169,6 +2182,117 @@ where
2169
2182
}
2170
2183
}
2171
2184
2185
+
2186
+
2187
+ //////////////////////////////////////////////////////////////////////////////
2188
+
2189
+ /// Iterator that deserializes an array into multiple JSON values.
2190
+ ///
2191
+ /// An array deserializer can be created from any JSON deserializer using the
2192
+ /// `Deserializer::into_array_iter` method.
2193
+ ///
2194
+ /// The top-level data should be a JSON array, but each array element can consist of any JSON
2195
+ /// value. An array deserializer only needs to keep a single array element in memory, and is
2196
+ /// therefore preferable over deserializing into a container type such as `Vec` when the complete
2197
+ /// array is too large to fit in memory.
2198
+ ///
2199
+ /// ```edition2018
2200
+ /// use serde_json::{Deserializer, Value};
2201
+ ///
2202
+ /// fn main() {
2203
+ /// let data = "[{\"k\": 3}, 1, \"cool\", \"stuff\", [0, 1, 2]]";
2204
+ ///
2205
+ /// let iter = Deserializer::from_str(data).into_array_iter::<Value>();
2206
+ ///
2207
+ /// for value in iter {
2208
+ /// println!("{}", value.unwrap());
2209
+ /// }
2210
+ /// }
2211
+ /// ```
2212
+ pub struct ArrayDeserializer < ' de , R , T > {
2213
+ de : Deserializer < R > ,
2214
+ started : bool , // True if we have consumed the first '['
2215
+ output : PhantomData < T > ,
2216
+ lifetime : PhantomData < & ' de ( ) > ,
2217
+ }
2218
+
2219
+ impl < ' de , R , T > ArrayDeserializer < ' de , R , T >
2220
+ where
2221
+ R : read:: Read < ' de > ,
2222
+ T : de:: Deserialize < ' de > ,
2223
+ {
2224
+ /// Create a JSON array deserializer from one of the possible serde_json
2225
+ /// input sources.
2226
+ ///
2227
+ /// Typically it is more convenient to use one of these methods instead:
2228
+ ///
2229
+ /// - Deserializer::from_str(...).into_array_iter()
2230
+ /// - Deserializer::from_bytes(...).into_array_iter()
2231
+ /// - Deserializer::from_reader(...).into_array_iter()
2232
+ pub fn new ( read : R ) -> Self {
2233
+ ArrayDeserializer {
2234
+ de : Deserializer :: new ( read) ,
2235
+ started : false ,
2236
+ output : PhantomData ,
2237
+ lifetime : PhantomData ,
2238
+ }
2239
+ }
2240
+
2241
+ fn end ( & mut self ) -> Option < Result < T > > {
2242
+ self . de . eat_char ( ) ;
2243
+ match self . de . end ( ) {
2244
+ Ok ( _) => None ,
2245
+ Err ( e) => Some ( Err ( e) ) ,
2246
+ }
2247
+ }
2248
+
2249
+ fn next_value ( & mut self ) -> Option < Result < T > > {
2250
+ match de:: Deserialize :: deserialize ( & mut self . de ) {
2251
+ Ok ( v) => Some ( Ok ( v) ) ,
2252
+ Err ( e) => Some ( Err ( e) )
2253
+ }
2254
+ }
2255
+ }
2256
+
2257
+ impl < ' de , R , T > Iterator for ArrayDeserializer < ' de , R , T >
2258
+ where
2259
+ R : Read < ' de > ,
2260
+ T : de:: Deserialize < ' de > ,
2261
+ {
2262
+ type Item = Result < T > ;
2263
+
2264
+ fn next ( & mut self ) -> Option < Result < T > > {
2265
+ match self . de . parse_whitespace ( ) {
2266
+ Ok ( None ) => Some ( Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ) ,
2267
+ Ok ( Some ( b'[' ) ) if !self . started => {
2268
+ self . started = true ;
2269
+ self . de . eat_char ( ) ;
2270
+
2271
+ // We have to peek at the next character here to handle an empty array.
2272
+ match self . de . parse_whitespace ( ) {
2273
+ Ok ( None ) => Some ( Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ) ,
2274
+ Ok ( Some ( b']' ) ) => self . end ( ) ,
2275
+ Ok ( Some ( _) ) => self . next_value ( ) ,
2276
+ Err ( e) => Some ( Err ( e) ) ,
2277
+ }
2278
+ } ,
2279
+ Ok ( Some ( b']' ) ) if self . started => self . end ( ) ,
2280
+ Ok ( Some ( b',' ) ) if self . started => {
2281
+ self . de . eat_char ( ) ;
2282
+
2283
+ match self . de . parse_whitespace ( ) {
2284
+ Ok ( None ) => Some ( Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ) ,
2285
+ Ok ( Some ( b']' ) ) => Some ( Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ) ,
2286
+ Ok ( Some ( _) ) => self . next_value ( ) ,
2287
+ Err ( e) => Some ( Err ( e) ) ,
2288
+ }
2289
+ } ,
2290
+ Ok ( Some ( _) ) => Some ( Err ( self . de . peek_error ( ErrorCode :: ExpectedSomeValue ) ) ) ,
2291
+ Err ( e) => Some ( Err ( e) ) ,
2292
+ }
2293
+ }
2294
+ }
2295
+
2172
2296
//////////////////////////////////////////////////////////////////////////////
2173
2297
2174
2298
fn from_trait < ' de , R , T > ( read : R ) -> Result < T >
0 commit comments