Index: sdk/lib/convert/json.dart |
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart |
index 035a89e46eadc760edb811d0071046131d2ab09d..845d53fc791a0c1c883b8c2f3b8f0cab5c24f9b4 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 |
+ * [cause] field. If the call returns an object that isn't directly |
+ * serializable, the [cause] is be null. |
+ */ |
+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)); |