Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: sdk/lib/convert/json.dart

Issue 649113005: Make JSON parsing work as a chunked conversion sink. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Fix bug. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sdk/lib/_internal/compiler/js_lib/convert_patch.dart ('k') | sdk/lib/internal/internal.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of dart.convert; 5 part of dart.convert;
6 6
7 /** 7 /**
8 * Error thrown by JSON serialization if an object cannot be serialized. 8 * Error thrown by JSON serialization if an object cannot be serialized.
9 * 9 *
10 * The [unsupportedObject] field holds that object that failed to be serialized. 10 * The [unsupportedObject] field holds that object that failed to be serialized.
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 * Throws [FormatException] if the input is not valid JSON text. 319 * Throws [FormatException] if the input is not valid JSON text.
320 */ 320 */
321 dynamic convert(String input) => _parseJson(input, _reviver); 321 dynamic convert(String input) => _parseJson(input, _reviver);
322 322
323 /** 323 /**
324 * Starts a conversion from a chunked JSON string to its corresponding 324 * Starts a conversion from a chunked JSON string to its corresponding
325 * object. 325 * object.
326 * 326 *
327 * The output [sink] receives exactly one decoded element through `add`. 327 * The output [sink] receives exactly one decoded element through `add`.
328 */ 328 */
329 StringConversionSink startChunkedConversion(Sink<Object> sink) { 329 external StringConversionSink startChunkedConversion(Sink<Object> sink);
330 return new _JsonDecoderSink(_reviver, sink);
331 }
332 330
333 // Override the base-classes bind, to provide a better type. 331 // Override the base-classes bind, to provide a better type.
334 Stream<Object> bind(Stream<String> stream) => super.bind(stream); 332 Stream<Object> bind(Stream<String> stream) => super.bind(stream);
335 } 333 }
336 334
337 /**
338 * Implements the chunked conversion from a JSON string to its corresponding
339 * object.
340 *
341 * The sink only creates one object, but its input can be chunked.
342 */
343 // TODO(floitsch): don't accumulate everything before starting to decode.
344 class _JsonDecoderSink extends _StringSinkConversionSink {
345 final _Reviver _reviver;
346 final Sink<Object> _sink;
347
348 _JsonDecoderSink(this._reviver, this._sink)
349 : super(new StringBuffer());
350
351 void close() {
352 super.close();
353 StringBuffer buffer = _stringSink;
354 String accumulated = buffer.toString();
355 buffer.clear();
356 Object decoded = _parseJson(accumulated, _reviver);
357 _sink.add(decoded);
358 _sink.close();
359 }
360 }
361
362 // Internal optimized JSON parsing implementation. 335 // Internal optimized JSON parsing implementation.
363 external _parseJson(String source, reviver(key, value)); 336 external _parseJson(String source, reviver(key, value));
364 337
365 338
366 // Implementation of encoder/stringifier. 339 // Implementation of encoder/stringifier.
367 340
368 Object _defaultToEncodable(object) => object.toJson(); 341 Object _defaultToEncodable(object) => object.toJson();
369 342
370 class _JsonStringifier { 343 class _JsonStringifier {
371 // Character code constants. 344 // Character code constants.
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 _sink.writeln(); 598 _sink.writeln();
626 _indentLevel--; 599 _indentLevel--;
627 _write('}'); 600 _write('}');
628 } 601 }
629 _seen.remove(object); 602 _seen.remove(object);
630 return true; 603 return true;
631 } 604 }
632 return super.stringifyJsonValue(object); 605 return super.stringifyJsonValue(object);
633 } 606 }
634 } 607 }
OLDNEW
« no previous file with comments | « sdk/lib/_internal/compiler/js_lib/convert_patch.dart ('k') | sdk/lib/internal/internal.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698