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

Unified Diff: sdk/lib/convert/json.dart

Issue 23554004: Made old dart:json library use convert to parse JSON. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 months 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 side-by-side diff with in-line comments
Download patch
Index: sdk/lib/convert/json.dart
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index 035a89e46eadc760edb811d0071046131d2ab09d..6f8354a4b70f9e8ac44b84ae3899d66722951292 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -5,6 +5,47 @@
part of dart.convert;
/**
+ * Error thrown by JSON serialization if an object cannot be serialized.
+ *
+ * The [unsupportedObject] field holds that object that failed to be serialized.
+ *
+ * If an object isn't directly serializable, the serializer calls the 'toJson'
+ * method on the object. If that call fails, the error will be stored in the
floitsch 2013/08/27 13:25:40 is stored Should we keep the `toJson` call. (If n
Lasse Reichstein Nielsen 2013/08/28 08:02:59 I'd say "no". We should have a function, the oppos
+ * [cause] field. If the call returns an object that isn't directly
+ * serializable, the [cause] will be null.
floitsch 2013/08/27 13:25:40 is `null`.
Lasse Reichstein Nielsen 2013/08/28 08:02:59 Done.
+ */
+class JsonUnsupportedObjectError extends Error {
+ /** The object that could not be serialized. */
+ final unsupportedObject;
+ /** The exception thrown by object's [:toJson:] method, if any. */
+ final cause;
+
+ JsonUnsupportedObjectError(this.unsupportedObject, { this.cause });
+
+ String toString() {
+ if (cause != null) {
+ return "Calling toJson method on object failed.";
+ } else {
+ return "Object toJson method returns non-serializable value.";
+ }
+ }
+}
+
+
+/**
+ * Reports that an object could not be stringified due to cyclic references.
+ *
+ * An object that references itself cannot be serialized by [stringify].
+ * When the cycle is detected, a [JsonCyclicError] is thrown.
+ */
+class JsonCyclicError extends JsonUnsupportedObjectError {
+ /** The first object that was detected as part of a cycle. */
+ JsonCyclicError(Object object): super(object);
+ String toString() => "Cyclic error in JSON stringify";
+}
+
+
+/**
* An instance of the default implementation of the [JsonCodec].
*
* This instance provides a convenient access to the most common JSON
@@ -181,7 +222,7 @@ 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);
+ Object convert(String input) => _parseJson(input, _reviver);
/**
* Starts a conversion from a chunked JSON string to its corresponding
@@ -217,8 +258,11 @@ class _JsonDecoderSink extends _StringSinkConversionSink {
StringBuffer buffer = _stringSink;
String accumulated = buffer.toString();
buffer.clear();
- Object decoded = OLD_JSON_LIB.parse(accumulated, _reviver);
+ Object decoded = _parseJson(accumulated, _reviver);
_chunkedSink.add(decoded);
_chunkedSink.close();
}
}
+
+// Internal optimized JSON parsing implementation.
+external _parseJson(String source, reviver(key, value));

Powered by Google App Engine
This is Rietveld 408576698