@@ -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
///
@@ -2149,6 +2162,117 @@ where
2149
2162
}
2150
2163
}
2151
2164
2165
+
2166
+
2167
+ //////////////////////////////////////////////////////////////////////////////
2168
+
2169
+ /// Iterator that deserializes an array into multiple JSON values.
2170
+ ///
2171
+ /// An array deserializer can be created from any JSON deserializer using the
2172
+ /// `Deserializer::into_array_iter` method.
2173
+ ///
2174
+ /// The top-level data should be a JSON array, but each array element can consist of any JSON
2175
+ /// value. An array deserializer only needs to keep a single array element in memory, and is
2176
+ /// therefore preferable over deserializing into a container type such as `Vec` when the complete
2177
+ /// array is too large to fit in memory.
2178
+ ///
2179
+ /// ```edition2018
2180
+ /// use serde_json::{Deserializer, Value};
2181
+ ///
2182
+ /// fn main() {
2183
+ /// let data = "[{\"k\": 3}, 1, \"cool\", \"stuff\", [0, 1, 2]]";
2184
+ ///
2185
+ /// let iter = Deserializer::from_str(data).into_array_iter::<Value>();
2186
+ ///
2187
+ /// for value in iter {
2188
+ /// println!("{}", value.unwrap());
2189
+ /// }
2190
+ /// }
2191
+ /// ```
2192
+ pub struct ArrayDeserializer < ' de , R , T > {
2193
+ de : Deserializer < R > ,
2194
+ started : bool , // True if we have consumed the first '['
2195
+ output : PhantomData < T > ,
2196
+ lifetime : PhantomData < & ' de ( ) > ,
2197
+ }
2198
+
2199
+ impl < ' de , R , T > ArrayDeserializer < ' de , R , T >
2200
+ where
2201
+ R : read:: Read < ' de > ,
2202
+ T : de:: Deserialize < ' de > ,
2203
+ {
2204
+ /// Create a JSON array deserializer from one of the possible serde_json
2205
+ /// input sources.
2206
+ ///
2207
+ /// Typically it is more convenient to use one of these methods instead:
2208
+ ///
2209
+ /// - Deserializer::from_str(...).into_array_iter()
2210
+ /// - Deserializer::from_bytes(...).into_array_iter()
2211
+ /// - Deserializer::from_reader(...).into_array_iter()
2212
+ pub fn new ( read : R ) -> Self {
2213
+ ArrayDeserializer {
2214
+ de : Deserializer :: new ( read) ,
2215
+ started : false ,
2216
+ output : PhantomData ,
2217
+ lifetime : PhantomData ,
2218
+ }
2219
+ }
2220
+
2221
+ fn end ( & mut self ) -> Option < Result < T > > {
2222
+ self . de . eat_char ( ) ;
2223
+ match self . de . end ( ) {
2224
+ Ok ( _) => None ,
2225
+ Err ( e) => Some ( Err ( e) ) ,
2226
+ }
2227
+ }
2228
+
2229
+ fn next_value ( & mut self ) -> Option < Result < T > > {
2230
+ match de:: Deserialize :: deserialize ( & mut self . de ) {
2231
+ Ok ( v) => Some ( Ok ( v) ) ,
2232
+ Err ( e) => Some ( Err ( e) )
2233
+ }
2234
+ }
2235
+ }
2236
+
2237
+ impl < ' de , R , T > Iterator for ArrayDeserializer < ' de , R , T >
2238
+ where
2239
+ R : Read < ' de > ,
2240
+ T : de:: Deserialize < ' de > ,
2241
+ {
2242
+ type Item = Result < T > ;
2243
+
2244
+ fn next ( & mut self ) -> Option < Result < T > > {
2245
+ match self . de . parse_whitespace ( ) {
2246
+ Ok ( None ) => Some ( Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ) ,
2247
+ Ok ( Some ( b'[' ) ) if !self . started => {
2248
+ self . started = true ;
2249
+ self . de . eat_char ( ) ;
2250
+
2251
+ // We have to peek at the next character here to handle an empty array.
2252
+ match self . de . parse_whitespace ( ) {
2253
+ Ok ( None ) => Some ( Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ) ,
2254
+ Ok ( Some ( b']' ) ) => self . end ( ) ,
2255
+ Ok ( Some ( _) ) => self . next_value ( ) ,
2256
+ Err ( e) => Some ( Err ( e) ) ,
2257
+ }
2258
+ } ,
2259
+ Ok ( Some ( b']' ) ) if self . started => self . end ( ) ,
2260
+ Ok ( Some ( b',' ) ) if self . started => {
2261
+ self . de . eat_char ( ) ;
2262
+
2263
+ match self . de . parse_whitespace ( ) {
2264
+ Ok ( None ) => Some ( Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ) ,
2265
+ Ok ( Some ( b']' ) ) => Some ( Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ) ,
2266
+ Ok ( Some ( _) ) => self . next_value ( ) ,
2267
+ Err ( e) => Some ( Err ( e) ) ,
2268
+ }
2269
+ } ,
2270
+ Ok ( Some ( _) ) => Some ( Err ( self . de . peek_error ( ErrorCode :: ExpectedSomeValue ) ) ) ,
2271
+ Err ( e) => Some ( Err ( e) ) ,
2272
+ }
2273
+ }
2274
+ }
2275
+
2152
2276
//////////////////////////////////////////////////////////////////////////////
2153
2277
2154
2278
fn from_trait < ' de , R , T > ( read : R ) -> Result < T >
0 commit comments