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