/// <summary> /// Write an error message. /// </summary> /// <param name="jsonWriter">JSON writer.</param> /// <param name="code">The code of the error.</param> /// <param name="message">The message of the error.</param> /// <param name="messageLanguage">The language of the message.</param> /// <param name="innerError">Inner error details that will be included in debug mode (if present).</param> /// <param name="instanceAnnotations">Instance annotations for this error.</param> /// <param name="writeInstanceAnnotationsDelegate">Action to write the instance annotations.</param> /// <param name="maxInnerErrorDepth">The maximumum number of nested inner errors to allow.</param> /// <param name="writingJsonLight">true if we're writing JSON lite, false if we're writing verbose JSON.</param> private static void WriteError(IJsonWriter jsonWriter, string code, string message, string messageLanguage, ODataInnerError innerError, IEnumerable <ODataInstanceAnnotation> instanceAnnotations, Action <IEnumerable <ODataInstanceAnnotation> > writeInstanceAnnotationsDelegate, int maxInnerErrorDepth, bool writingJsonLight) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(code != null, "code != null"); Debug.Assert(message != null, "message != null"); Debug.Assert(messageLanguage != null, "messageLanguage != null"); Debug.Assert(instanceAnnotations != null, "instanceAnnotations != null"); // if verbose JSON: { "error": { // if JSON lite: { "odata.error": { jsonWriter.StartObjectScope(); jsonWriter.WriteName(writingJsonLight ? ODataAnnotationNames.ODataError : JsonConstants.ODataErrorName); jsonWriter.StartObjectScope(); // "code": "<code>" jsonWriter.WriteName(JsonConstants.ODataErrorCodeName); jsonWriter.WriteValue(code); // "message": { jsonWriter.WriteName(JsonConstants.ODataErrorMessageName); jsonWriter.StartObjectScope(); // "lang": "<messageLanguage>" jsonWriter.WriteName(JsonConstants.ODataErrorMessageLanguageName); jsonWriter.WriteValue(messageLanguage); // "value": "<message>" jsonWriter.WriteName(JsonConstants.ODataErrorMessageValueName); jsonWriter.WriteValue(message); // } jsonWriter.EndObjectScope(); if (innerError != null) { WriteInnerError(jsonWriter, innerError, JsonConstants.ODataErrorInnerErrorName, /* recursionDepth */ 0, maxInnerErrorDepth); } if (writingJsonLight) { Debug.Assert(writeInstanceAnnotationsDelegate != null, "writeInstanceAnnotations != null"); writeInstanceAnnotationsDelegate(instanceAnnotations); } // } } jsonWriter.EndObjectScope(); jsonWriter.EndObjectScope(); }
/// <summary> /// Write an inner error property and message. /// </summary> /// <param name="jsonWriter">The JSON writer to write the error to.</param> /// <param name="innerError">Inner error details.</param> /// <param name="innerErrorPropertyName">The property name for the inner error property.</param> /// <param name="recursionDepth">The number of times this method has been called recursively.</param> /// <param name="maxInnerErrorDepth">The maximumum number of nested inner errors to allow.</param> private static void WriteInnerError(IJsonWriter jsonWriter, ODataInnerError innerError, string innerErrorPropertyName, int recursionDepth, int maxInnerErrorDepth) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(innerErrorPropertyName != null, "innerErrorPropertyName != null"); ValidationUtils.IncreaseAndValidateRecursionDepth(ref recursionDepth, maxInnerErrorDepth); // "innererror": { jsonWriter.WriteName(innerErrorPropertyName); jsonWriter.StartObjectScope(); //// NOTE: we add empty elements if no information is provided for the message, error type and stack trace //// to stay compatible with Astoria. // "message": "<message>" jsonWriter.WriteName(JsonConstants.ODataErrorInnerErrorMessageName); jsonWriter.WriteValue(innerError.Message ?? string.Empty); // "type": "<typename"> jsonWriter.WriteName(JsonConstants.ODataErrorInnerErrorTypeNameName); jsonWriter.WriteValue(innerError.TypeName ?? string.Empty); // "stacktrace": "<stacktrace>" jsonWriter.WriteName(JsonConstants.ODataErrorInnerErrorStackTraceName); jsonWriter.WriteValue(innerError.StackTrace ?? string.Empty); if (innerError.InnerError != null) { // "internalexception": { <nested inner error> } WriteInnerError(jsonWriter, innerError.InnerError, JsonConstants.ODataErrorInnerErrorInnerErrorName, recursionDepth, maxInnerErrorDepth); } // } jsonWriter.EndObjectScope(); }
/// <summary> /// Writes the ODataValue (primitive, collection or resource value) to the underlying json writer. /// </summary> /// <param name="jsonWriter">The <see cref="JsonWriter"/> to write to.</param> /// <param name="odataValue">value to write.</param> internal static void WriteODataValue(this IJsonWriter jsonWriter, ODataValue odataValue) { if (odataValue == null || odataValue is ODataNullValue) { jsonWriter.WriteValue((string)null); return; } object objectValue = odataValue.FromODataValue(); if (EdmLibraryExtensions.IsPrimitiveType(objectValue.GetType())) { jsonWriter.WritePrimitiveValue(objectValue); return; } ODataResourceValue resourceValue = odataValue as ODataResourceValue; if (resourceValue != null) { jsonWriter.StartObjectScope(); foreach (ODataProperty property in resourceValue.Properties) { jsonWriter.WriteName(property.Name); jsonWriter.WriteODataValue(property.ODataValue); } jsonWriter.EndObjectScope(); return; } ODataCollectionValue collectionValue = odataValue as ODataCollectionValue; if (collectionValue != null) { jsonWriter.StartArrayScope(); foreach (object item in collectionValue.Items) { // Will not be able to accurately serialize complex objects unless they are ODataValues. ODataValue collectionItem = item as ODataValue; if (item != null) { jsonWriter.WriteODataValue(collectionItem); } else { throw new ODataException(ODataErrorStrings.ODataJsonWriter_UnsupportedValueInCollection); } } jsonWriter.EndArrayScope(); return; } throw new ODataException( ODataErrorStrings.ODataJsonWriter_UnsupportedValueType(odataValue.GetType().FullName)); }
/// <summary> /// Writes the __metadata property with the specified type name. /// </summary> /// <param name="jsonWriter">The JSON writer to write to.</param> /// <param name="typeName">The type name to write.</param> internal static void WriteMetadataWithTypeName(IJsonWriter jsonWriter, string typeName) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(typeName != null, "typeName != null"); // Write the __metadata object jsonWriter.WriteName(JsonConstants.ODataMetadataName); jsonWriter.StartObjectScope(); // "type": "typename" jsonWriter.WriteName(JsonConstants.ODataMetadataTypeName); jsonWriter.WriteValue(typeName); // End the __metadata jsonWriter.EndObjectScope(); }
/// <summary> /// Write an inner error property and message. /// </summary> /// <param name="jsonWriter">The JSON writer to write the error to.</param> /// <param name="innerError">Inner error details.</param> /// <param name="innerErrorPropertyName">The property name for the inner error property.</param> /// <param name="recursionDepth">The number of times this method has been called recursively.</param> /// <param name="maxInnerErrorDepth">The maximum number of nested inner errors to allow.</param> private static void WriteInnerError( IJsonWriter jsonWriter, ODataInnerError innerError, string innerErrorPropertyName, int recursionDepth, int maxInnerErrorDepth) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(innerErrorPropertyName != null, "innerErrorPropertyName != null"); ValidationUtils.IncreaseAndValidateRecursionDepth(ref recursionDepth, maxInnerErrorDepth); // "innererror": jsonWriter.WriteName(innerErrorPropertyName); jsonWriter.StartObjectScope(); if (innerError.Properties != null) { foreach (KeyValuePair <string, ODataValue> pair in innerError.Properties) { jsonWriter.WriteName(pair.Key); if (pair.Value is ODataNullValue && (pair.Key == JsonConstants.ODataErrorInnerErrorMessageName || pair.Key == JsonConstants.ODataErrorInnerErrorStackTraceName || pair.Key == JsonConstants.ODataErrorInnerErrorTypeNameName)) { // Write empty string for null values in stacktrace, type and message properties of inner error. jsonWriter.WriteODataValue(new ODataPrimitiveValue(string.Empty)); } else { jsonWriter.WriteODataValue(pair.Value); } } } if (innerError.InnerError != null) { // "internalexception": { <nested inner error> } WriteInnerError(jsonWriter, innerError.InnerError, JsonConstants.ODataErrorInnerErrorInnerErrorName, recursionDepth, maxInnerErrorDepth); } // } jsonWriter.EndObjectScope(); }
/// <summary> /// Writes the json object value to the <paramref name="jsonWriter"/>. /// </summary> /// <param name="jsonWriter">The <see cref="JsonWriter"/> to write to.</param> /// <param name="jsonObjectValue">Writes the given json object value to the underlying json writer.</param> /// <param name="injectPropertyAction">Called when the top-level object is started to possibly inject first property into the object.</param> internal static void WriteJsonObjectValue(this IJsonWriter jsonWriter, IDictionary <string, object> jsonObjectValue, Action <IJsonWriter> injectPropertyAction) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(jsonObjectValue != null, "jsonObjectValue != null"); jsonWriter.StartObjectScope(); if (injectPropertyAction != null) { injectPropertyAction(jsonWriter); } foreach (KeyValuePair <string, object> property in jsonObjectValue) { jsonWriter.WriteName(property.Key); jsonWriter.WriteJsonValue(property.Value); } jsonWriter.EndObjectScope(); }
private static void WriteErrorDetails( IJsonWriter jsonWriter, IEnumerable <ODataErrorDetail> details, string odataErrorDetailsName) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(details != null, "details != null"); Debug.Assert(odataErrorDetailsName != null, "odataErrorDetailsName != null"); // "details": [ jsonWriter.WriteName(odataErrorDetailsName); jsonWriter.StartArrayScope(); foreach (var detail in details.Where(d => d != null)) { // { jsonWriter.StartObjectScope(); // "code": "301", jsonWriter.WriteName(JsonConstants.ODataErrorCodeName); jsonWriter.WriteValue(detail.ErrorCode ?? string.Empty); if (detail.Target != null) { // "target": "$search" jsonWriter.WriteName(JsonConstants.ODataErrorTargetName); jsonWriter.WriteValue(detail.Target); } // "message": "$search query option not supported", jsonWriter.WriteName(JsonConstants.ODataErrorMessageName); jsonWriter.WriteValue(detail.Message ?? string.Empty); // } jsonWriter.EndObjectScope(); } // ] jsonWriter.EndArrayScope(); }
/// <summary> /// Write an inner error property and message. /// </summary> /// <param name="jsonWriter">The JSON writer to write the error to.</param> /// <param name="innerError">Inner error details.</param> /// <param name="innerErrorPropertyName">The property name for the inner error property.</param> /// <param name="recursionDepth">The number of times this method has been called recursively.</param> /// <param name="maxInnerErrorDepth">The maximum number of nested inner errors to allow.</param> private static void WriteInnerError(IJsonWriter jsonWriter, ODataInnerError innerError, string innerErrorPropertyName, int recursionDepth, int maxInnerErrorDepth) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(innerErrorPropertyName != null, "innerErrorPropertyName != null"); ValidationUtils.IncreaseAndValidateRecursionDepth(ref recursionDepth, maxInnerErrorDepth); // "innererror": { jsonWriter.WriteName(innerErrorPropertyName); jsonWriter.StartObjectScope(); //// NOTE: we add empty elements if no information is provided for the message, error type and stack trace //// to stay compatible with Astoria. // "message": "<message>" jsonWriter.WriteName(JsonConstants.ODataErrorInnerErrorMessageName); jsonWriter.WriteValue(innerError.Message ?? string.Empty); // "type": "<typename"> jsonWriter.WriteName(JsonConstants.ODataErrorInnerErrorTypeNameName); jsonWriter.WriteValue(innerError.TypeName ?? string.Empty); // "stacktrace": "<stacktrace>" jsonWriter.WriteName(JsonConstants.ODataErrorInnerErrorStackTraceName); jsonWriter.WriteValue(innerError.StackTrace ?? string.Empty); if (innerError.InnerError != null) { // "internalexception": { <nested inner error> } WriteInnerError(jsonWriter, innerError.InnerError, JsonConstants.ODataErrorInnerErrorInnerErrorName, recursionDepth, maxInnerErrorDepth); } // } jsonWriter.EndObjectScope(); }
private static void WriteErrorDetails(IJsonWriter jsonWriter, IEnumerable<ODataErrorDetail> details, string odataErrorDetailsName) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(details != null, "details != null"); Debug.Assert(odataErrorDetailsName != null, "odataErrorDetailsName != null"); // "details": [ jsonWriter.WriteName(odataErrorDetailsName); jsonWriter.StartArrayScope(); foreach (var detail in details.Where(d => d != null)) { // { jsonWriter.StartObjectScope(); // "code": "301", jsonWriter.WriteName(JsonConstants.ODataErrorCodeName); jsonWriter.WriteValue(detail.ErrorCode ?? string.Empty); if (detail.Target != null) { // "target": "$search" jsonWriter.WriteName(JsonConstants.ODataErrorTargetName); jsonWriter.WriteValue(detail.Target); } // "message": "$search query option not supported", jsonWriter.WriteName(JsonConstants.ODataErrorMessageName); jsonWriter.WriteValue(detail.Message ?? string.Empty); // } jsonWriter.EndObjectScope(); } // ] jsonWriter.EndArrayScope(); }
/// <summary> /// Write an error message. /// </summary> /// <param name="jsonWriter">JSON writer.</param> /// <param name="code">The code of the error.</param> /// <param name="message">The message of the error.</param> /// <param name="target">The target of the error.</param> /// <param name="details">The details of the error.</param> /// <param name="innerError">Inner error details that will be included in debug mode (if present).</param> /// <param name="instanceAnnotations">Instance annotations for this error.</param> /// <param name="writeInstanceAnnotationsDelegate">Action to write the instance annotations.</param> /// <param name="maxInnerErrorDepth">The maximum number of nested inner errors to allow.</param> /// <param name="writingJsonLight">true if we're writing JSON lite, false if we're writing verbose JSON.</param> private static void WriteError(IJsonWriter jsonWriter, string code, string message, string target, IEnumerable<ODataErrorDetail> details, ODataInnerError innerError, IEnumerable<ODataInstanceAnnotation> instanceAnnotations, Action<IEnumerable<ODataInstanceAnnotation>> writeInstanceAnnotationsDelegate, int maxInnerErrorDepth, bool writingJsonLight) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(code != null, "code != null"); Debug.Assert(message != null, "message != null"); Debug.Assert(instanceAnnotations != null, "instanceAnnotations != null"); // "error": { jsonWriter.StartObjectScope(); if (writingJsonLight) { jsonWriter.WriteName(JsonLightConstants.ODataErrorPropertyName); } else { jsonWriter.WriteName(JsonConstants.ODataErrorName); } jsonWriter.StartObjectScope(); // "code": "<code>" jsonWriter.WriteName(JsonConstants.ODataErrorCodeName); jsonWriter.WriteValue(code); // "message": "<message string>" jsonWriter.WriteName(JsonConstants.ODataErrorMessageName); jsonWriter.WriteValue(message); // For example, "target": "query", if (target != null) { jsonWriter.WriteName(JsonConstants.ODataErrorTargetName); jsonWriter.WriteValue(target); } // Such as, "details": [ // { // "code": "301", // "target": "$search", // "message": "$search query option not supported" // }] if (details != null) { WriteErrorDetails(jsonWriter, details, JsonConstants.ODataErrorDetailsName); } if (innerError != null) { WriteInnerError(jsonWriter, innerError, JsonConstants.ODataErrorInnerErrorName, /* recursionDepth */ 0, maxInnerErrorDepth); } if (writingJsonLight) { Debug.Assert(writeInstanceAnnotationsDelegate != null, "writeInstanceAnnotations != null"); writeInstanceAnnotationsDelegate(instanceAnnotations); } // } } jsonWriter.EndObjectScope(); jsonWriter.EndObjectScope(); }
/// <summary> /// Write an error message. /// </summary> /// <param name="jsonWriter">JSON writer.</param> /// <param name="code">The code of the error.</param> /// <param name="message">The message of the error.</param> /// <param name="target">The target of the error.</param> /// <param name="details">The details of the error.</param> /// <param name="innerError">Inner error details that will be included in debug mode (if present).</param> /// <param name="instanceAnnotations">Instance annotations for this error.</param> /// <param name="writeInstanceAnnotationsDelegate">Action to write the instance annotations.</param> /// <param name="maxInnerErrorDepth">The maximum number of nested inner errors to allow.</param> /// <param name="writingJsonLight">true if we're writing JSON lite, false if we're writing verbose JSON.</param> private static void WriteError( IJsonWriter jsonWriter, string code, string message, string target, IEnumerable <ODataErrorDetail> details, ODataInnerError innerError, ICollection <ODataInstanceAnnotation> instanceAnnotations, Action <ICollection <ODataInstanceAnnotation> > writeInstanceAnnotationsDelegate, int maxInnerErrorDepth, bool writingJsonLight) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(code != null, "code != null"); Debug.Assert(message != null, "message != null"); Debug.Assert(instanceAnnotations != null, "instanceAnnotations != null"); // "error": { jsonWriter.StartObjectScope(); if (writingJsonLight) { jsonWriter.WriteName(JsonLightConstants.ODataErrorPropertyName); } else { jsonWriter.WriteName(JsonConstants.ODataErrorName); } jsonWriter.StartObjectScope(); // "code": "<code>" jsonWriter.WriteName(JsonConstants.ODataErrorCodeName); jsonWriter.WriteValue(code); // "message": "<message string>" jsonWriter.WriteName(JsonConstants.ODataErrorMessageName); jsonWriter.WriteValue(message); // For example, "target": "query", if (target != null) { jsonWriter.WriteName(JsonConstants.ODataErrorTargetName); jsonWriter.WriteValue(target); } // Such as, "details": [ // { // "code": "301", // "target": "$search", // "message": "$search query option not supported" // }] if (details != null) { WriteErrorDetails(jsonWriter, details, JsonConstants.ODataErrorDetailsName); } if (innerError != null) { WriteInnerError(jsonWriter, innerError, JsonConstants.ODataErrorInnerErrorName, /* recursionDepth */ 0, maxInnerErrorDepth); } if (writingJsonLight) { Debug.Assert(writeInstanceAnnotationsDelegate != null, "writeInstanceAnnotationsDelegate != null"); writeInstanceAnnotationsDelegate(instanceAnnotations); } // } } jsonWriter.EndObjectScope(); jsonWriter.EndObjectScope(); }
/// <summary> /// Start writing a feed. /// </summary> /// <param name="feed">The feed to write.</param> protected override void StartFeed(ODataFeed feed) { Debug.Assert(feed != null, "feed != null"); IJsonWriter jsonWriter = this.jsonLightOutputContext.JsonWriter; if (this.ParentNavigationLink == null) { // Top-level feed. // "{" jsonWriter.StartObjectScope(); // @odata.context this.jsonLightEntryAndFeedSerializer.WriteFeedContextUri(this.CurrentFeedScope.GetOrCreateTypeContext(this.jsonLightOutputContext.Model, this.jsonLightOutputContext.WritingResponse)); if (this.jsonLightOutputContext.WritingResponse) { // Write the inline count if it's available. this.WriteFeedCount(feed, /*propertyName*/ null); // Write the next link if it's available. this.WriteFeedNextLink(feed, /*propertyName*/ null); // Write the delta link if it's available. this.WriteFeedDeltaLink(feed); } // Write custom instance annotations this.jsonLightEntryAndFeedSerializer.InstanceAnnotationWriter.WriteInstanceAnnotations(feed.InstanceAnnotations, this.CurrentFeedScope.InstanceAnnotationWriteTracker); // "value": jsonWriter.WriteValuePropertyName(); // Start array which will hold the entries in the feed. jsonWriter.StartArrayScope(); } else { // Expanded feed. Debug.Assert( this.ParentNavigationLink != null && this.ParentNavigationLink.IsCollection.HasValue && this.ParentNavigationLink.IsCollection.Value, "We should have verified that feeds can only be written into IsCollection = true links in requests."); string propertyName = this.ParentNavigationLink.Name; this.ValidateNoDeltaLinkForExpandedFeed(feed); this.ValidateNoCustomInstanceAnnotationsForExpandedFeed(feed); if (this.jsonLightOutputContext.WritingResponse) { // Write the inline count if it's available. this.WriteFeedCount(feed, propertyName); // Write the next link if it's available. this.WriteFeedNextLink(feed, propertyName); // And then write the property name to start the value. jsonWriter.WriteName(propertyName); // Start array which will hold the entries in the feed. jsonWriter.StartArrayScope(); } else { JsonLightNavigationLinkScope navigationLinkScope = (JsonLightNavigationLinkScope)this.ParentNavigationLinkScope; if (!navigationLinkScope.FeedWritten) { // Close the entity reference link array (if written) if (navigationLinkScope.EntityReferenceLinkWritten) { jsonWriter.EndArrayScope(); } // And then write the property name to start the value. jsonWriter.WriteName(propertyName); // Start array which will hold the entries in the feed. jsonWriter.StartArrayScope(); navigationLinkScope.FeedWritten = true; } } } }
/// <summary> /// Writes the current Json object. /// </summary> /// <param name="reader">The Json reader providing the data.</param> /// <param name="jsonWriter">The Json writer writes data into memory stream.</param> private static void WriteCurrentJsonObject(IJsonReader reader, IJsonWriter jsonWriter) { Stack <JsonNodeType> nodeTypes = new Stack <JsonNodeType>(); do { switch (reader.NodeType) { case JsonNodeType.PrimitiveValue: { if (reader.Value != null) { jsonWriter.WritePrimitiveValue(reader.Value); } else { jsonWriter.WriteValue((string)null); } } break; case JsonNodeType.Property: { jsonWriter.WriteName(reader.Value.ToString()); } break; case JsonNodeType.StartObject: { nodeTypes.Push(reader.NodeType); jsonWriter.StartObjectScope(); } break; case JsonNodeType.StartArray: { nodeTypes.Push(reader.NodeType); jsonWriter.StartArrayScope(); } break; case JsonNodeType.EndObject: { Debug.Assert(nodeTypes.Peek() == JsonNodeType.StartObject); nodeTypes.Pop(); jsonWriter.EndObjectScope(); } break; case JsonNodeType.EndArray: { Debug.Assert(nodeTypes.Peek() == JsonNodeType.StartArray); nodeTypes.Pop(); jsonWriter.EndArrayScope(); } break; default: { throw new ODataException(String.Format( CultureInfo.InvariantCulture, "Unexpected reader.NodeType: {0}.", reader.NodeType)); } } reader.ReadNext(); // This can be EndOfInput, where nodeTypes should be empty. }while (nodeTypes.Count != 0); jsonWriter.Flush(); }
/// <summary> /// Write an error message. /// </summary> /// <param name="jsonWriter">JSON writer.</param> /// <param name="code">The code of the error.</param> /// <param name="message">The message of the error.</param> /// <param name="innerError">Inner error details that will be included in debug mode (if present).</param> /// <param name="instanceAnnotations">Instance annotations for this error.</param> /// <param name="writeInstanceAnnotationsDelegate">Action to write the instance annotations.</param> /// <param name="maxInnerErrorDepth">The maximum number of nested inner errors to allow.</param> /// <param name="writingJsonLight">true if we're writing JSON lite, false if we're writing verbose JSON.</param> private static void WriteError(IJsonWriter jsonWriter, string code, string message, ODataInnerError innerError, IEnumerable<ODataInstanceAnnotation> instanceAnnotations, Action<IEnumerable<ODataInstanceAnnotation>> writeInstanceAnnotationsDelegate, int maxInnerErrorDepth, bool writingJsonLight) { Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(code != null, "code != null"); Debug.Assert(message != null, "message != null"); Debug.Assert(instanceAnnotations != null, "instanceAnnotations != null"); // "error": { jsonWriter.StartObjectScope(); if (writingJsonLight) { jsonWriter.WriteName(JsonLightConstants.ODataErrorPropertyName); } else { jsonWriter.WriteName(JsonConstants.ODataErrorName); } jsonWriter.StartObjectScope(); // "code": "<code>" jsonWriter.WriteName(JsonConstants.ODataErrorCodeName); jsonWriter.WriteValue(code); // "message": "<message string>" jsonWriter.WriteName(JsonConstants.ODataErrorMessageName); jsonWriter.WriteValue(message); if (innerError != null) { WriteInnerError(jsonWriter, innerError, JsonConstants.ODataErrorInnerErrorName, /* recursionDepth */ 0, maxInnerErrorDepth); } if (writingJsonLight) { Debug.Assert(writeInstanceAnnotationsDelegate != null, "writeInstanceAnnotations != null"); writeInstanceAnnotationsDelegate(instanceAnnotations); } // } } jsonWriter.EndObjectScope(); jsonWriter.EndObjectScope(); }