/// <summary>
        /// Read the <see cref="HttpContent"/> as OData resource set.
        /// </summary>
        /// <param name="content">The http content.</param>
        /// <returns>The OData array.</returns>
        public static async Task <ODataArray> ReadAsODataArrayAsync(this HttpContent content)
        {
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            Stream stream = await content.ReadAsStreamAsync();

            using (JsonDocument doc = await JsonDocument.ParseAsync(stream))
            {
                JsonElement root = doc.RootElement;

                // OData array is an object as:
                // {
                //     "@odata.context":...
                //     "value" [ ... ]
                // }
                if (root.ValueKind != JsonValueKind.Object)
                {
                    return(null);
                }

                if (!root.TryGetProperty("value", out JsonElement value) &&
                    value.ValueKind != JsonValueKind.Array)
                {
                    return(null);
                }

                ODataArray odataArray = new ODataArray();

                // value array
                foreach (var item in value.EnumerateArray())
                {
                    IODataValue itemValue = item.ParseAsODataValue();
                    odataArray.Add(itemValue);
                }

                // context uri
                odataArray.ContextUri = ReadStringPropertyValue(root, "@odata.context", "@context");

                // next link
                odataArray.NextLink = ReadStringPropertyValue(root, "@odata.nextlink", "@nextlink");

                // odata.count
                odataArray.TotalCount = ReadIntPropertyValue(root, "@odata.count", "@count");

                return(odataArray);
            }
        }
        /// <summary>
        /// Read the <see cref="HttpContent"/> as OData resource.
        /// </summary>
        /// <param name="content">The http content.</param>
        /// <returns>The OData object.</returns>
        public static async Task <ODataObject> ReadAsODataObjectAsync(this HttpContent content)
        {
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            Stream stream = await content.ReadAsStreamAsync();

            using (JsonDocument doc = await JsonDocument.ParseAsync(stream))
            {
                JsonElement root = doc.RootElement;

                // OData object is an object as:
                // {
                //     "@odata.context":...
                //     "Id": 2,
                //     "Name: "Sam"
                // }
                if (root.ValueKind != JsonValueKind.Object)
                {
                    return(null);
                }

                ODataObject odataObject = new ODataObject();

                // value array
                foreach (JsonProperty property in root.EnumerateObject())
                {
                    if (property.Name == "@odata.context" || property.Name == "@context")
                    {
                        // context uri
                        odataObject.ContextUri = property.Value.GetString();
                    }
                    else
                    {
                        IODataValue itemValue = property.Value.ParseAsODataValue();
                        odataObject[property.Name] = itemValue;
                    }
                }

                return(odataObject);
            }
        }