Chromium Code Reviews| Index: sdk/lib/convert/json.dart |
| diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart |
| index df036a194a26173bb6415596234f11b86d43e741..d2f2e52308f74c5b1bc9a23637fbcdf6b2011d7e 100644 |
| --- a/sdk/lib/convert/json.dart |
| +++ b/sdk/lib/convert/json.dart |
| @@ -66,7 +66,7 @@ class _ReviverJsonCodec extends JsonCodec { |
| } |
| /** |
| - * A [JsonEncoder] converts JSON objects to strings. |
| + * This class converts JSON objects to strings. |
| */ |
| class JsonEncoder extends Converter<Object, String> { |
| JsonEncoder(); |
| @@ -99,13 +99,45 @@ class JsonEncoder extends Converter<Object, String> { |
| * serialized, the new values may or may not be reflected in the result. |
| */ |
| String convert(Object o) => OLD_JSON_LIB.stringify(o); |
| + |
| + ChunkedConversionSink<Object, dynamic> startChunkedConversion( |
| + ChunkedConversionSink sink) { |
| + return new _JsonEncoderSink(sink.adaptTo(outputInterface)); |
| + } |
| + |
| + ChunkedConversionInterface get outputInterface => |
| + StringConversionSink.INTERFACE; |
| } |
| -typedef _Reviver(var key, var value); |
| +/** |
| + * Implements the chunked conversion from object to its JSON representation. |
| + * |
| + * The sink only accepts one value (and therefore only allows its input in |
| + * [addNonChunked], but will produce output in a chunked way. |
| + */ |
| +class _JsonEncoderSink extends ChunkedConversionSink<Object, Object> { |
| + StringConversionSink _sink; |
| + |
| + _JsonEncoderSink(this._sink); |
| + /** |
| + * Encodes the given object [o]. |
| + * |
| + * Although the input is non-chunked the output will receive the |
| + * encoded string in chunks. |
| + */ |
| + void addNonChunked(Object o) { |
| + ClosableStringSink stringSink = _sink.asStringSink(); |
| + OLD_JSON_LIB.printOn(o, stringSink); |
| + stringSink.close(); |
| + } |
| +} |
| + |
| + |
| +typedef _Reviver(var key, var value); |
| /** |
| - * A [JsonDecoder] parses JSON strings and builds the corresponding objects. |
| + * This class parses JSON strings and builds the corresponding objects. |
| */ |
| class JsonDecoder extends Converter<String, Object> { |
| final _Reviver _reviver; |
| @@ -117,7 +149,7 @@ class JsonDecoder extends Converter<String, Object> { |
| JsonDecoder(reviver(var key, var value)) : this._reviver = reviver; |
| /** |
| - * Converts the given Json-string [input] to its corresponding object. |
| + * Converts the given JSON-string [input] to its corresponding object. |
| * |
| * Parsed JSON values are of the types [num], [String], [bool], [Null], |
| * [List]s of parsed JSON values or [Map]s from [String] to parsed |
| @@ -132,4 +164,40 @@ class JsonDecoder extends Converter<String, Object> { |
| * Throws [FormatException] if the input is not valid JSON text. |
| */ |
| Object convert(String input) => OLD_JSON_LIB.parse(input, _reviver); |
| + |
| + /** |
| + * Starts a conversion from a chunked JSON string to its corresponding |
| + * object. |
| + * |
| + * The output [sink] receives exactly one decoded element through |
| + * `addNonChunked`. |
| + */ |
| + StringConversionSink startChunkedConversion(ChunkedConversionSink sink) { |
| + return new _JsonDecoderSink(_reviver, sink.adaptTo(outputInterface)); |
| + } |
| + |
| + ChunkedConversionInterface get inputInterface => |
| + StringConversionSink.INTERFACE; |
| +} |
| + |
| +/** |
| + * Implements the chunked conversion from a JSON string to its corresponding |
| + * object. |
| + * |
| + * The sink only creates one object, but its input can be chunked. |
| + */ |
| +// TODO(floitsch): don't accumulate everything before starting to decode. |
| +class _JsonDecoderSink extends _StringSinkConversionSink { |
| + final _Reviver _reviver; |
| + final ChunkedConversionSink<Object, Object> _chunkedSink; |
| + |
| + _JsonDecoderSink(this._reviver, this._chunkedSink) |
| + : super(new StringBuffer()); |
| + |
| + void close() { |
| + super.close(); |
| + StringBuffer buffer = _stringSink; |
|
Søren Gjesse
2013/07/24 09:26:41
Any reason for this temporary?
Maybe relying on t
floitsch
2013/07/24 18:31:15
The temporary was to get the StringBuffer type. I
|
| + Object decoded = OLD_JSON_LIB.parse(buffer.toString(), _reviver); |
| + _chunkedSink.addNonChunked(decoded); |
| + } |
| } |