/// <summary> /// Writes a set of links (Uris) in response to a $links query; includes optional count and next-page-link information. /// </summary> /// <param name="jsonWriter">The <see cref="JsonWriter"/> to write to.</param> /// <param name="baseUri">The base Uri used for writing.</param> /// <param name="associatedEntityLinks">The set of associated entity links to write out.</param> /// <param name="includeResultsWrapper">True if the 'results' wrapper should be included into the payload; otherwise false.</param> private static void WriteAssociatedEntityLinks(JsonWriter jsonWriter, Uri baseUri, ODataAssociatedEntityLinks associatedEntityLinks, bool includeResultsWrapper) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(associatedEntityLinks != null, "links != null"); if (includeResultsWrapper) { // { jsonWriter.StartObjectScope(); } if (associatedEntityLinks.InlineCount.HasValue) { Debug.Assert(includeResultsWrapper, "Expected 'includeResultsWrapper' to be true if a count is specified."); jsonWriter.WriteName(JsonConstants.ODataCountName); jsonWriter.WriteValue(associatedEntityLinks.InlineCount.Value); } if (includeResultsWrapper) { // "results": jsonWriter.WriteDataArrayName(); } jsonWriter.StartArrayScope(); IEnumerable <ODataAssociatedEntityLink> entityLinks = associatedEntityLinks.Links; if (entityLinks != null) { foreach (ODataAssociatedEntityLink link in entityLinks) { WriteAssociatedEntityLink(jsonWriter, baseUri, link); } } jsonWriter.EndArrayScope(); if (associatedEntityLinks.NextLink != null) { // "__next": ... Debug.Assert(includeResultsWrapper, "Expected 'includeResultsWrapper' to be true if a next page link is specified."); jsonWriter.WriteName(JsonConstants.ODataNextLinkName); jsonWriter.WriteValue(UriUtils.UriToString(associatedEntityLinks.NextLink)); } if (includeResultsWrapper) { jsonWriter.EndObjectScope(); } }
/// <summary> /// Writes a set of links (Uris) in response to a $links query; includes optional count and next-page-link information. /// </summary> /// <param name="jsonWriter">The <see cref="JsonWriter"/> to write to.</param> /// <param name="baseUri">The base Uri used for writing.</param> /// <param name="associatedEntityLinks">The set of associated entity links to write out.</param> /// <param name="includeResultsWrapper">True if the 'results' wrapper should be included into the payload; otherwise false.</param> private static void WriteAssociatedEntityLinks(JsonWriter jsonWriter, Uri baseUri, ODataAssociatedEntityLinks associatedEntityLinks, bool includeResultsWrapper) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(jsonWriter != null, "jsonWriter != null"); Debug.Assert(associatedEntityLinks != null, "links != null"); if (includeResultsWrapper) { // { jsonWriter.StartObjectScope(); } if (associatedEntityLinks.InlineCount.HasValue) { Debug.Assert(includeResultsWrapper, "Expected 'includeResultsWrapper' to be true if a count is specified."); jsonWriter.WriteName(JsonConstants.ODataCountName); jsonWriter.WriteValue(associatedEntityLinks.InlineCount.Value); } if (includeResultsWrapper) { // "results": jsonWriter.WriteDataArrayName(); } jsonWriter.StartArrayScope(); IEnumerable<ODataAssociatedEntityLink> entityLinks = associatedEntityLinks.Links; if (entityLinks != null) { foreach (ODataAssociatedEntityLink link in entityLinks) { WriteAssociatedEntityLink(jsonWriter, baseUri, link); } } jsonWriter.EndArrayScope(); if (associatedEntityLinks.NextLink != null) { // "__next": ... Debug.Assert(includeResultsWrapper, "Expected 'includeResultsWrapper' to be true if a next page link is specified."); jsonWriter.WriteName(JsonConstants.ODataNextLinkName); jsonWriter.WriteValue(UriUtils.UriToString(associatedEntityLinks.NextLink)); } if (includeResultsWrapper) { jsonWriter.EndObjectScope(); } }
/// <summary> /// Writes out the value of a MultiValue property. /// </summary> /// <param name="jsonWriter">The <see cref="JsonWriter"/> to write to.</param> /// <param name="metadata">The metadata provider to use or null if no metadata is available.</param> /// <param name="multiValue">The bag value to write.</param> /// <param name="metadataType">The metadata type for the MultiValue.</param> /// <param name="isOpenPropertyType">True if the type name belongs to an open property.</param> /// <param name="version">The protocol version used for writing.</param> private static void WriteMultiValue( JsonWriter jsonWriter, DataServiceMetadataProviderWrapper metadata, ODataMultiValue multiValue, ResourceType metadataType, bool isOpenPropertyType, ODataVersion version) { Debug.Assert(multiValue != null, "multiValue != null"); // Start the object scope which will represent the entire MultiValue instance jsonWriter.StartObjectScope(); // "__metadata": { "type": "typename" } // If the MultiValue has type information write out the metadata and the type in it. string typeName = multiValue.TypeName; // resolve the type name to the resource type; if no type name is specified we will use the // type inferred from metadata ResourceType multiValueType = MetadataUtils.ResolveTypeName(metadata, metadataType, ref typeName, ResourceTypeKind.MultiValue, isOpenPropertyType); if (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(); } // "results": [ // This represents the array of items in the MultiValue jsonWriter.WriteDataArrayName(); jsonWriter.StartArrayScope(); // Iterate through the MultiValue items and write them out (treat null Items as an empty enumeration) IEnumerable items = multiValue.Items; if (items != null) { ResourceType expectedItemType = multiValueType == null ? null : ((MultiValueResourceType)multiValueType).ItemType; foreach (object item in items) { ValidationUtils.ValidateMultiValueItem(item); ODataComplexValue itemAsComplexValue = item as ODataComplexValue; if (itemAsComplexValue != null) { WriteComplexValue(jsonWriter, metadata, itemAsComplexValue, expectedItemType, false, version); } else { ODataMultiValue itemAsMultiValue = item as ODataMultiValue; if (itemAsMultiValue != null) { throw new ODataException(Strings.ODataWriter_NestedMultiValuesAreNotSupported); } else { WritePrimitiveValue(jsonWriter, item, expectedItemType); } } } } // End the array scope which holds the items jsonWriter.EndArrayScope(); // End the object scope which holds the entire MultiValue jsonWriter.EndObjectScope(); }